1 // This defines the interface to the QsciLexerCPP class.
2 //
3 // Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
4 //
5 // This file is part of QScintilla.
6 //
7 // This file may be used under the terms of the GNU General Public License
8 // version 3.0 as published by the Free Software Foundation and appearing in
9 // the file LICENSE included in the packaging of this file.  Please review the
10 // following information to ensure the GNU General Public License version 3.0
11 // requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 //
13 // If you do not wish to use this file under the terms of the GPL version 3.0
14 // then you may purchase a commercial license.  For more information contact
15 // info@riverbankcomputing.com.
16 //
17 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
18 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 
20 
21 #ifndef QSCILEXERCPP_H
22 #define QSCILEXERCPP_H
23 
24 #include <QObject>
25 
26 #include <Qsci/qsciglobal.h>
27 #include <Qsci/qscilexer.h>
28 
29 
30 //! \brief The QsciLexerCPP class encapsulates the Scintilla C++
31 //! lexer.
32 class QSCINTILLA_EXPORT QsciLexerCPP : public QsciLexer
33 {
34     Q_OBJECT
35 
36 public:
37     //! This enum defines the meanings of the different styles used by the
38     //! C++ lexer.
39     enum {
40         //! The default.
41         Default = 0,
42         InactiveDefault = Default + 64,
43 
44         //! A C comment.
45         Comment = 1,
46         InactiveComment = Comment + 64,
47 
48         //! A C++ comment line.
49         CommentLine = 2,
50         InactiveCommentLine = CommentLine + 64,
51 
52         //! A JavaDoc/Doxygen style C comment.
53         CommentDoc = 3,
54         InactiveCommentDoc = CommentDoc + 64,
55 
56         //! A number.
57         Number = 4,
58         InactiveNumber = Number + 64,
59 
60         //! A keyword.
61         Keyword = 5,
62         InactiveKeyword = Keyword + 64,
63 
64         //! A double-quoted string.
65         DoubleQuotedString = 6,
66         InactiveDoubleQuotedString = DoubleQuotedString + 64,
67 
68         //! A single-quoted string.
69         SingleQuotedString = 7,
70         InactiveSingleQuotedString = SingleQuotedString + 64,
71 
72         //! An IDL UUID.
73         UUID = 8,
74         InactiveUUID = UUID + 64,
75 
76         //! A pre-processor block.
77         PreProcessor = 9,
78         InactivePreProcessor = PreProcessor + 64,
79 
80         //! An operator.
81         Operator = 10,
82         InactiveOperator = Operator + 64,
83 
84         //! An identifier
85         Identifier = 11,
86         InactiveIdentifier = Identifier + 64,
87 
88         //! The end of a line where a string is not closed.
89         UnclosedString = 12,
90         InactiveUnclosedString = UnclosedString + 64,
91 
92         //! A C# verbatim string.
93         VerbatimString = 13,
94         InactiveVerbatimString = VerbatimString + 64,
95 
96         //! A JavaScript regular expression.
97         Regex = 14,
98         InactiveRegex = Regex + 64,
99 
100         //! A JavaDoc/Doxygen style C++ comment line.
101         CommentLineDoc = 15,
102         InactiveCommentLineDoc = CommentLineDoc + 64,
103 
104         //! A keyword defined in keyword set number 2.  The class must be
105         //! sub-classed and re-implement keywords() to make use of this style.
106         KeywordSet2 = 16,
107         InactiveKeywordSet2 = KeywordSet2 + 64,
108 
109         //! A JavaDoc/Doxygen keyword.
110         CommentDocKeyword = 17,
111         InactiveCommentDocKeyword = CommentDocKeyword + 64,
112 
113         //! A JavaDoc/Doxygen keyword error.
114         CommentDocKeywordError = 18,
115         InactiveCommentDocKeywordError = CommentDocKeywordError + 64,
116 
117         //! A global class or typedef defined in keyword set number 5.  The
118         //! class must be sub-classed and re-implement keywords() to make use
119         //! of this style.
120         GlobalClass = 19,
121         InactiveGlobalClass = GlobalClass + 64,
122 
123         //! A C++ raw string.
124         RawString = 20,
125         InactiveRawString = RawString + 64,
126 
127         //! A Vala triple-quoted verbatim string.
128         TripleQuotedVerbatimString = 21,
129         InactiveTripleQuotedVerbatimString = TripleQuotedVerbatimString + 64,
130 
131         //! A Pike hash-quoted string.
132         HashQuotedString = 22,
133         InactiveHashQuotedString = HashQuotedString + 64,
134 
135         //! A pre-processor stream comment.
136         PreProcessorComment = 23,
137         InactivePreProcessorComment = PreProcessorComment + 64,
138 
139         //! A JavaDoc/Doxygen style pre-processor comment.
140         PreProcessorCommentLineDoc = 24,
141         InactivePreProcessorCommentLineDoc = PreProcessorCommentLineDoc + 64,
142 
143         //! A user-defined literal.
144         UserLiteral = 25,
145         InactiveUserLiteral = UserLiteral + 64,
146 
147         //! A task marker.
148         TaskMarker = 26,
149         InactiveTaskMarker = TaskMarker + 64,
150 
151         //! An escape sequence.
152         EscapeSequence = 27,
153         InactiveEscapeSequence = EscapeSequence + 64,
154     };
155 
156     //! Construct a QsciLexerCPP with parent \a parent.  \a parent is typically
157     //! the QsciScintilla instance.  \a caseInsensitiveKeywords is true if the
158     //! lexer ignores the case of keywords.
159     QsciLexerCPP(QObject *parent = 0, bool caseInsensitiveKeywords = false);
160 
161     //! Destroys the QsciLexerCPP instance.
162     virtual ~QsciLexerCPP();
163 
164     //! Returns the name of the language.
165     const char *language() const;
166 
167     //! Returns the name of the lexer.  Some lexers support a number of
168     //! languages.
169     const char *lexer() const;
170 
171     //! \internal Returns the character sequences that can separate
172     //! auto-completion words.
173     QStringList autoCompletionWordSeparators() const;
174 
175     //! \internal Returns a space separated list of words or characters in
176     //! a particular style that define the end of a block for
177     //! auto-indentation.  The styles is returned via \a style.
178     const char *blockEnd(int *style = 0) const;
179 
180     //! \internal Returns a space separated list of words or characters in
181     //! a particular style that define the start of a block for
182     //! auto-indentation.  The styles is returned via \a style.
183     const char *blockStart(int *style = 0) const;
184 
185     //! \internal Returns a space separated list of keywords in a
186     //! particular style that define the start of a block for
187     //! auto-indentation.  The styles is returned via \a style.
188     const char *blockStartKeyword(int *style = 0) const;
189 
190     //! \internal Returns the style used for braces for brace matching.
191     int braceStyle() const;
192 
193     //! Returns the string of characters that comprise a word.
194     const char *wordCharacters() const;
195 
196     //! Returns the foreground colour of the text for style number \a style.
197     //!
198     //! \sa defaultPaper()
199     QColor defaultColor(int style) const;
200 
201     //! Returns the end-of-line fill for style number \a style.
202     bool defaultEolFill(int style) const;
203 
204     //! Returns the font for style number \a style.
205     QFont defaultFont(int style) const;
206 
207     //! Returns the background colour of the text for style number \a style.
208     //!
209     //! \sa defaultColor()
210     QColor defaultPaper(int style) const;
211 
212     //! Returns the set of keywords for the keyword set \a set recognised
213     //! by the lexer as a space separated string.  Set 1 is normally used for
214     //! primary keywords and identifiers.  Set 2 is normally used for secondary
215     //! keywords and identifiers.  Set 3 is normally used for documentation
216     //! comment keywords.  Set 4 is normally used for global classes and
217     //! typedefs.
218     const char *keywords(int set) const;
219 
220     //! Returns the descriptive name for style number \a style.  If the
221     //! style is invalid for this language then an empty QString is returned.
222     //! This is intended to be used in user preference dialogs.
223     QString description(int style) const;
224 
225     //! Causes all properties to be refreshed by emitting the
226     //! propertyChanged() signal as required.
227     void refreshProperties();
228 
229     //! Returns true if "} else {" lines can be folded.
230     //!
231     //! \sa setFoldAtElse()
foldAtElse()232     bool foldAtElse() const {return fold_atelse;}
233 
234     //! Returns true if multi-line comment blocks can be folded.
235     //!
236     //! \sa setFoldComments()
foldComments()237     bool foldComments() const {return fold_comments;}
238 
239     //! Returns true if trailing blank lines are included in a fold block.
240     //!
241     //! \sa setFoldCompact()
foldCompact()242     bool foldCompact() const {return fold_compact;}
243 
244     //! Returns true if preprocessor blocks can be folded.
245     //!
246     //! \sa setFoldPreprocessor()
foldPreprocessor()247     bool foldPreprocessor() const {return fold_preproc;}
248 
249     //! Returns true if preprocessor lines (after the preprocessor
250     //! directive) are styled.
251     //!
252     //! \sa setStylePreprocessor()
stylePreprocessor()253     bool stylePreprocessor() const {return style_preproc;}
254 
255     //! If \a allowed is true then '$' characters are allowed in identifier
256     //! names.  The default is true.
257     //!
258     //! \sa dollarsAllowed()
259     void setDollarsAllowed(bool allowed);
260 
261     //! Returns true if '$' characters are allowed in identifier names.
262     //!
263     //! \sa setDollarsAllowed()
dollarsAllowed()264     bool dollarsAllowed() const {return dollars;}
265 
266     //! If \a enabled is true then triple quoted strings are highlighted.  The
267     //! default is false.
268     //!
269     //! \sa highlightTripleQuotedStrings()
270     void setHighlightTripleQuotedStrings(bool enabled);
271 
272     //! Returns true if triple quoted strings should be highlighted.
273     //!
274     //! \sa setHighlightTripleQuotedStrings()
highlightTripleQuotedStrings()275     bool highlightTripleQuotedStrings() const {return highlight_triple;}
276 
277     //! If \a enabled is true then hash quoted strings are highlighted.  The
278     //! default is false.
279     //!
280     //! \sa highlightHashQuotedStrings()
281     void setHighlightHashQuotedStrings(bool enabled);
282 
283     //! Returns true if hash quoted strings should be highlighted.
284     //!
285     //! \sa setHighlightHashQuotedStrings()
highlightHashQuotedStrings()286     bool highlightHashQuotedStrings() const {return highlight_hash;}
287 
288     //! If \a enabled is true then back-quoted raw strings are highlighted.
289     //! The default is false.
290     //!
291     //! \sa highlightBackQuotedStrings()
292     void setHighlightBackQuotedStrings(bool enabled);
293 
294     //! Returns true if back-quoted raw strings should be highlighted.
295     //!
296     //! \sa setHighlightBackQuotedStrings()
highlightBackQuotedStrings()297     bool highlightBackQuotedStrings() const {return highlight_back;}
298 
299     //! If \a enabled is true then escape sequences in strings are highlighted.
300     //! The default is false.
301     //!
302     //! \sa highlightEscapeSequences()
303     void setHighlightEscapeSequences(bool enabled);
304 
305     //! Returns true if escape sequences in strings should be highlighted.
306     //!
307     //! \sa setHighlightEscapeSequences()
highlightEscapeSequences()308     bool highlightEscapeSequences() const {return highlight_escape;}
309 
310     //! If \a allowed is true then escape sequences are allowed in verbatim
311     //! strings.  The default is false.
312     //!
313     //! \sa verbatimStringEscapeSequencesAllowed()
314     void setVerbatimStringEscapeSequencesAllowed(bool allowed);
315 
316     //! Returns true if hash quoted strings should be highlighted.
317     //!
318     //! \sa setVerbatimStringEscapeSequencesAllowed()
verbatimStringEscapeSequencesAllowed()319     bool verbatimStringEscapeSequencesAllowed() const {return vs_escape;}
320 
321 public slots:
322     //! If \a fold is true then "} else {" lines can be folded.  The
323     //! default is false.
324     //!
325     //! \sa foldAtElse()
326     virtual void setFoldAtElse(bool fold);
327 
328     //! If \a fold is true then multi-line comment blocks can be folded.
329     //! The default is false.
330     //!
331     //! \sa foldComments()
332     virtual void setFoldComments(bool fold);
333 
334     //! If \a fold is true then trailing blank lines are included in a fold
335     //! block. The default is true.
336     //!
337     //! \sa foldCompact()
338     virtual void setFoldCompact(bool fold);
339 
340     //! If \a fold is true then preprocessor blocks can be folded.  The
341     //! default is true.
342     //!
343     //! \sa foldPreprocessor()
344     virtual void setFoldPreprocessor(bool fold);
345 
346     //! If \a style is true then preprocessor lines (after the preprocessor
347     //! directive) are styled.  The default is false.
348     //!
349     //! \sa stylePreprocessor()
350     virtual void setStylePreprocessor(bool style);
351 
352 protected:
353     //! The lexer's properties are read from the settings \a qs.  \a prefix
354     //! (which has a trailing '/') should be used as a prefix to the key of
355     //! each setting.  true is returned if there is no error.
356     //!
357     //! \sa writeProperties()
358     bool readProperties(QSettings &qs,const QString &prefix);
359 
360     //! The lexer's properties are written to the settings \a qs.
361     //! \a prefix (which has a trailing '/') should be used as a prefix to
362     //! the key of each setting.  true is returned if there is no error.
363     //!
364     //! \sa readProperties()
365     bool writeProperties(QSettings &qs,const QString &prefix) const;
366 
367 private:
368     void setAtElseProp();
369     void setCommentProp();
370     void setCompactProp();
371     void setPreprocProp();
372     void setStylePreprocProp();
373     void setDollarsProp();
374     void setHighlightTripleProp();
375     void setHighlightHashProp();
376     void setHighlightBackProp();
377     void setHighlightEscapeProp();
378     void setVerbatimStringEscapeProp();
379 
380     bool fold_atelse;
381     bool fold_comments;
382     bool fold_compact;
383     bool fold_preproc;
384     bool style_preproc;
385     bool dollars;
386     bool highlight_triple;
387     bool highlight_hash;
388     bool highlight_back;
389     bool highlight_escape;
390     bool vs_escape;
391 
392     bool nocase;
393 
394     QsciLexerCPP(const QsciLexerCPP &);
395     QsciLexerCPP &operator=(const QsciLexerCPP &);
396 };
397 
398 #endif
399