OSDN Git Service

Update license.
[qt-creator-jp/qt-creator-jp.git] / src / libs / glsl / glslkeywords.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
8 **
9 **
10 ** GNU Lesser General Public License Usage
11 **
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 **
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 **
23 ** Other Usage
24 **
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **************************************************************************/
32
33 #include "glsllexer.h"
34 #include "glslparser.h"
35
36
37 using namespace GLSL;
38
39 static inline int classify2(const char *s) {
40   if (s[0] == 'd') {
41     if (s[1] == 'o') {
42       return Parser::T_DO;
43     }
44   }
45   else if (s[0] == 'i') {
46     if (s[1] == 'f') {
47       return Parser::T_IF;
48     }
49     else if (s[1] == 'n') {
50       return Parser::T_IN;
51     }
52   }
53   return Parser::T_IDENTIFIER;
54 }
55
56 static inline int classify3(const char *s) {
57   if (s[0] == 'f') {
58     if (s[1] == 'o') {
59       if (s[2] == 'r') {
60         return Parser::T_FOR;
61       }
62     }
63   }
64   else if (s[0] == 'i') {
65     if (s[1] == 'n') {
66       if (s[2] == 't') {
67         return Parser::T_INT;
68       }
69     }
70   }
71   else if (s[0] == 'o') {
72     if (s[1] == 'u') {
73       if (s[2] == 't') {
74         return Parser::T_OUT;
75       }
76     }
77   }
78   return Parser::T_IDENTIFIER;
79 }
80
81 static inline int classify4(const char *s) {
82   if (s[0] == 'b') {
83     if (s[1] == 'o') {
84       if (s[2] == 'o') {
85         if (s[3] == 'l') {
86           return Parser::T_BOOL;
87         }
88       }
89     }
90   }
91   else if (s[0] == 'c') {
92     if (s[1] == 'a') {
93       if (s[2] == 's') {
94         if (s[3] == 'e') {
95           return Parser::T_CASE | Lexer::Variant_GLSL_150;
96         }
97       }
98     }
99   }
100   else if (s[0] == 'e') {
101     if (s[1] == 'l') {
102       if (s[2] == 's') {
103         if (s[3] == 'e') {
104           return Parser::T_ELSE;
105         }
106       }
107     }
108   }
109   else if (s[0] == 'f') {
110     if (s[1] == 'l') {
111       if (s[2] == 'a') {
112         if (s[3] == 't') {
113           return Parser::T_FLAT | Lexer::Variant_GLSL_150;
114         }
115       }
116     }
117   }
118   else if (s[0] == 'l') {
119     if (s[1] == 'o') {
120       if (s[2] == 'w') {
121         if (s[3] == 'p') {
122           return Parser::T_LOWP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400;
123         }
124       }
125     }
126   }
127   else if (s[0] == 'm') {
128     if (s[1] == 'a') {
129       if (s[2] == 't') {
130         if (s[3] == '2') {
131           return Parser::T_MAT2;
132         }
133         else if (s[3] == '3') {
134           return Parser::T_MAT3;
135         }
136         else if (s[3] == '4') {
137           return Parser::T_MAT4;
138         }
139       }
140     }
141   }
142   else if (s[0] == 't') {
143     if (s[1] == 'r') {
144       if (s[2] == 'u') {
145         if (s[3] == 'e') {
146           return Parser::T_TRUE;
147         }
148       }
149     }
150   }
151   else if (s[0] == 'u') {
152     if (s[1] == 'i') {
153       if (s[2] == 'n') {
154         if (s[3] == 't') {
155           return Parser::T_UINT | Lexer::Variant_GLSL_150;
156         }
157       }
158     }
159   }
160   else if (s[0] == 'v') {
161     if (s[1] == 'e') {
162       if (s[2] == 'c') {
163         if (s[3] == '2') {
164           return Parser::T_VEC2;
165         }
166         else if (s[3] == '3') {
167           return Parser::T_VEC3;
168         }
169         else if (s[3] == '4') {
170           return Parser::T_VEC4;
171         }
172       }
173     }
174     else if (s[1] == 'o') {
175       if (s[2] == 'i') {
176         if (s[3] == 'd') {
177           return Parser::T_VOID;
178         }
179       }
180     }
181   }
182   return Parser::T_IDENTIFIER;
183 }
184
185 static inline int classify5(const char *s) {
186   if (s[0] == 'b') {
187     if (s[1] == 'r') {
188       if (s[2] == 'e') {
189         if (s[3] == 'a') {
190           if (s[4] == 'k') {
191             return Parser::T_BREAK;
192           }
193         }
194       }
195     }
196     else if (s[1] == 'v') {
197       if (s[2] == 'e') {
198         if (s[3] == 'c') {
199           if (s[4] == '2') {
200             return Parser::T_BVEC2;
201           }
202           else if (s[4] == '3') {
203             return Parser::T_BVEC3;
204           }
205           else if (s[4] == '4') {
206             return Parser::T_BVEC4;
207           }
208         }
209       }
210     }
211   }
212   else if (s[0] == 'c') {
213     if (s[1] == 'o') {
214       if (s[2] == 'n') {
215         if (s[3] == 's') {
216           if (s[4] == 't') {
217             return Parser::T_CONST;
218           }
219         }
220       }
221     }
222   }
223   else if (s[0] == 'd') {
224     if (s[1] == 'm') {
225       if (s[2] == 'a') {
226         if (s[3] == 't') {
227           if (s[4] == '2') {
228             return Parser::T_DMAT2 | Lexer::Variant_GLSL_400;
229           }
230           else if (s[4] == '3') {
231             return Parser::T_DMAT3 | Lexer::Variant_GLSL_400;
232           }
233           else if (s[4] == '4') {
234             return Parser::T_DMAT4 | Lexer::Variant_GLSL_400;
235           }
236         }
237       }
238     }
239     else if (s[1] == 'v') {
240       if (s[2] == 'e') {
241         if (s[3] == 'c') {
242           if (s[4] == '2') {
243             return Parser::T_DVEC2 | Lexer::Variant_GLSL_400;
244           }
245           else if (s[4] == '3') {
246             return Parser::T_DVEC3 | Lexer::Variant_GLSL_400;
247           }
248           else if (s[4] == '4') {
249             return Parser::T_DVEC4 | Lexer::Variant_GLSL_400;
250           }
251         }
252       }
253     }
254   }
255   else if (s[0] == 'f') {
256     if (s[1] == 'a') {
257       if (s[2] == 'l') {
258         if (s[3] == 's') {
259           if (s[4] == 'e') {
260             return Parser::T_FALSE;
261           }
262         }
263       }
264     }
265     else if (s[1] == 'l') {
266       if (s[2] == 'o') {
267         if (s[3] == 'a') {
268           if (s[4] == 't') {
269             return Parser::T_FLOAT;
270           }
271         }
272       }
273     }
274   }
275   else if (s[0] == 'h') {
276     if (s[1] == 'i') {
277       if (s[2] == 'g') {
278         if (s[3] == 'h') {
279           if (s[4] == 'p') {
280             return Parser::T_HIGHP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400;
281           }
282         }
283       }
284     }
285   }
286   else if (s[0] == 'i') {
287     if (s[1] == 'n') {
288       if (s[2] == 'o') {
289         if (s[3] == 'u') {
290           if (s[4] == 't') {
291             return Parser::T_INOUT;
292           }
293         }
294       }
295     }
296     else if (s[1] == 'v') {
297       if (s[2] == 'e') {
298         if (s[3] == 'c') {
299           if (s[4] == '2') {
300             return Parser::T_IVEC2;
301           }
302           else if (s[4] == '3') {
303             return Parser::T_IVEC3;
304           }
305           else if (s[4] == '4') {
306             return Parser::T_IVEC4;
307           }
308         }
309       }
310     }
311   }
312   else if (s[0] == 'p') {
313     if (s[1] == 'a') {
314       if (s[2] == 't') {
315         if (s[3] == 'c') {
316           if (s[4] == 'h') {
317             return Parser::T_PATCH | Lexer::Variant_GLSL_400;
318           }
319         }
320       }
321     }
322   }
323   else if (s[0] == 'u') {
324     if (s[1] == 'v') {
325       if (s[2] == 'e') {
326         if (s[3] == 'c') {
327           if (s[4] == '2') {
328             return Parser::T_UVEC2 | Lexer::Variant_GLSL_150;
329           }
330           else if (s[4] == '3') {
331             return Parser::T_UVEC3 | Lexer::Variant_GLSL_150;
332           }
333           else if (s[4] == '4') {
334             return Parser::T_UVEC4 | Lexer::Variant_GLSL_150;
335           }
336         }
337       }
338     }
339   }
340   else if (s[0] == 'w') {
341     if (s[1] == 'h') {
342       if (s[2] == 'i') {
343         if (s[3] == 'l') {
344           if (s[4] == 'e') {
345             return Parser::T_WHILE;
346           }
347         }
348       }
349     }
350   }
351   return Parser::T_IDENTIFIER;
352 }
353
354 static inline int classify6(const char *s) {
355   if (s[0] == 'd') {
356     if (s[1] == 'o') {
357       if (s[2] == 'u') {
358         if (s[3] == 'b') {
359           if (s[4] == 'l') {
360             if (s[5] == 'e') {
361               return Parser::T_DOUBLE | Lexer::Variant_GLSL_400;
362             }
363           }
364         }
365       }
366     }
367   }
368   else if (s[0] == 'l') {
369     if (s[1] == 'a') {
370       if (s[2] == 'y') {
371         if (s[3] == 'o') {
372           if (s[4] == 'u') {
373             if (s[5] == 't') {
374               return Parser::T_LAYOUT | Lexer::Variant_GLSL_150;
375             }
376           }
377         }
378       }
379     }
380   }
381   else if (s[0] == 'm') {
382     if (s[1] == 'a') {
383       if (s[2] == 't') {
384         if (s[3] == '2') {
385           if (s[4] == 'x') {
386             if (s[5] == '2') {
387               return Parser::T_MAT2X2 | Lexer::Variant_GLSL_120;
388             }
389             else if (s[5] == '3') {
390               return Parser::T_MAT2X3 | Lexer::Variant_GLSL_120;
391             }
392             else if (s[5] == '4') {
393               return Parser::T_MAT2X4 | Lexer::Variant_GLSL_120;
394             }
395           }
396         }
397         else if (s[3] == '3') {
398           if (s[4] == 'x') {
399             if (s[5] == '2') {
400               return Parser::T_MAT3X2 | Lexer::Variant_GLSL_120;
401             }
402             else if (s[5] == '3') {
403               return Parser::T_MAT3X3 | Lexer::Variant_GLSL_120;
404             }
405             else if (s[5] == '4') {
406               return Parser::T_MAT3X4 | Lexer::Variant_GLSL_120;
407             }
408           }
409         }
410         else if (s[3] == '4') {
411           if (s[4] == 'x') {
412             if (s[5] == '2') {
413               return Parser::T_MAT4X2 | Lexer::Variant_GLSL_120;
414             }
415             else if (s[5] == '3') {
416               return Parser::T_MAT4X3 | Lexer::Variant_GLSL_120;
417             }
418             else if (s[5] == '4') {
419               return Parser::T_MAT4X4 | Lexer::Variant_GLSL_120;
420             }
421           }
422         }
423       }
424     }
425   }
426   else if (s[0] == 'r') {
427     if (s[1] == 'e') {
428       if (s[2] == 't') {
429         if (s[3] == 'u') {
430           if (s[4] == 'r') {
431             if (s[5] == 'n') {
432               return Parser::T_RETURN;
433             }
434           }
435         }
436       }
437     }
438   }
439   else if (s[0] == 's') {
440     if (s[1] == 'a') {
441       if (s[2] == 'm') {
442         if (s[3] == 'p') {
443           if (s[4] == 'l') {
444             if (s[5] == 'e') {
445               return Parser::T_SAMPLE | Lexer::Variant_Reserved;
446             }
447           }
448         }
449       }
450     }
451     else if (s[1] == 'm') {
452       if (s[2] == 'o') {
453         if (s[3] == 'o') {
454           if (s[4] == 't') {
455             if (s[5] == 'h') {
456               return Parser::T_SMOOTH | Lexer::Variant_GLSL_150;
457             }
458           }
459         }
460       }
461     }
462     else if (s[1] == 't') {
463       if (s[2] == 'r') {
464         if (s[3] == 'u') {
465           if (s[4] == 'c') {
466             if (s[5] == 't') {
467               return Parser::T_STRUCT;
468             }
469           }
470         }
471       }
472     }
473     else if (s[1] == 'w') {
474       if (s[2] == 'i') {
475         if (s[3] == 't') {
476           if (s[4] == 'c') {
477             if (s[5] == 'h') {
478               return Parser::T_SWITCH | Lexer::Variant_GLSL_150;
479             }
480           }
481         }
482       }
483     }
484   }
485   return Parser::T_IDENTIFIER;
486 }
487
488 static inline int classify7(const char *s) {
489   if (s[0] == 'd') {
490     if (s[1] == 'e') {
491       if (s[2] == 'f') {
492         if (s[3] == 'a') {
493           if (s[4] == 'u') {
494             if (s[5] == 'l') {
495               if (s[6] == 't') {
496                 return Parser::T_DEFAULT | Lexer::Variant_GLSL_150;
497               }
498             }
499           }
500         }
501       }
502     }
503     else if (s[1] == 'i') {
504       if (s[2] == 's') {
505         if (s[3] == 'c') {
506           if (s[4] == 'a') {
507             if (s[5] == 'r') {
508               if (s[6] == 'd') {
509                 return Parser::T_DISCARD | Lexer::Variant_FragmentShader;
510               }
511             }
512           }
513         }
514       }
515     }
516     else if (s[1] == 'm') {
517       if (s[2] == 'a') {
518         if (s[3] == 't') {
519           if (s[4] == '2') {
520             if (s[5] == 'x') {
521               if (s[6] == '2') {
522                 return Parser::T_DMAT2X2 | Lexer::Variant_GLSL_400;
523               }
524               else if (s[6] == '3') {
525                 return Parser::T_DMAT2X3 | Lexer::Variant_GLSL_400;
526               }
527               else if (s[6] == '4') {
528                 return Parser::T_DMAT2X4 | Lexer::Variant_GLSL_400;
529               }
530             }
531           }
532           else if (s[4] == '3') {
533             if (s[5] == 'x') {
534               if (s[6] == '2') {
535                 return Parser::T_DMAT3X2 | Lexer::Variant_GLSL_400;
536               }
537               else if (s[6] == '3') {
538                 return Parser::T_DMAT3X3 | Lexer::Variant_GLSL_400;
539               }
540               else if (s[6] == '4') {
541                 return Parser::T_DMAT3X4 | Lexer::Variant_GLSL_400;
542               }
543             }
544           }
545           else if (s[4] == '4') {
546             if (s[5] == 'x') {
547               if (s[6] == '2') {
548                 return Parser::T_DMAT4X2 | Lexer::Variant_GLSL_400;
549               }
550               else if (s[6] == '3') {
551                 return Parser::T_DMAT4X3 | Lexer::Variant_GLSL_400;
552               }
553               else if (s[6] == '4') {
554                 return Parser::T_DMAT4X4 | Lexer::Variant_GLSL_400;
555               }
556             }
557           }
558         }
559       }
560     }
561   }
562   else if (s[0] == 'm') {
563     if (s[1] == 'e') {
564       if (s[2] == 'd') {
565         if (s[3] == 'i') {
566           if (s[4] == 'u') {
567             if (s[5] == 'm') {
568               if (s[6] == 'p') {
569                 return Parser::T_MEDIUMP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400;
570               }
571             }
572           }
573         }
574       }
575     }
576   }
577   else if (s[0] == 'u') {
578     if (s[1] == 'n') {
579       if (s[2] == 'i') {
580         if (s[3] == 'f') {
581           if (s[4] == 'o') {
582             if (s[5] == 'r') {
583               if (s[6] == 'm') {
584                 return Parser::T_UNIFORM;
585               }
586             }
587           }
588         }
589       }
590     }
591   }
592   else if (s[0] == 'v') {
593     if (s[1] == 'a') {
594       if (s[2] == 'r') {
595         if (s[3] == 'y') {
596           if (s[4] == 'i') {
597             if (s[5] == 'n') {
598               if (s[6] == 'g') {
599                 return Parser::T_VARYING;
600               }
601             }
602           }
603         }
604       }
605     }
606   }
607   return Parser::T_IDENTIFIER;
608 }
609
610 static inline int classify8(const char *s) {
611   if (s[0] == 'c') {
612     if (s[1] == 'e') {
613       if (s[2] == 'n') {
614         if (s[3] == 't') {
615           if (s[4] == 'r') {
616             if (s[5] == 'o') {
617               if (s[6] == 'i') {
618                 if (s[7] == 'd') {
619                   return Parser::T_CENTROID | Lexer::Variant_GLSL_120;
620                 }
621               }
622             }
623           }
624         }
625       }
626     }
627     else if (s[1] == 'o') {
628       if (s[2] == 'n') {
629         if (s[3] == 't') {
630           if (s[4] == 'i') {
631             if (s[5] == 'n') {
632               if (s[6] == 'u') {
633                 if (s[7] == 'e') {
634                   return Parser::T_CONTINUE;
635                 }
636               }
637             }
638           }
639         }
640       }
641     }
642   }
643   return Parser::T_IDENTIFIER;
644 }
645
646 static inline int classify9(const char *s) {
647   if (s[0] == 'a') {
648     if (s[1] == 't') {
649       if (s[2] == 't') {
650         if (s[3] == 'r') {
651           if (s[4] == 'i') {
652             if (s[5] == 'b') {
653               if (s[6] == 'u') {
654                 if (s[7] == 't') {
655                   if (s[8] == 'e') {
656                     return Parser::T_ATTRIBUTE | Lexer::Variant_VertexShader;
657                   }
658                 }
659               }
660             }
661           }
662         }
663       }
664     }
665   }
666   else if (s[0] == 'i') {
667     if (s[1] == 'n') {
668       if (s[2] == 'v') {
669         if (s[3] == 'a') {
670           if (s[4] == 'r') {
671             if (s[5] == 'i') {
672               if (s[6] == 'a') {
673                 if (s[7] == 'n') {
674                   if (s[8] == 't') {
675                     return Parser::T_INVARIANT;
676                   }
677                 }
678               }
679             }
680           }
681         }
682       }
683     }
684   }
685   else if (s[0] == 'p') {
686     if (s[1] == 'r') {
687       if (s[2] == 'e') {
688         if (s[3] == 'c') {
689           if (s[4] == 'i') {
690             if (s[5] == 's') {
691               if (s[6] == 'i') {
692                 if (s[7] == 'o') {
693                   if (s[8] == 'n') {
694                     return Parser::T_PRECISION | Lexer::Variant_GLSL_ES_100;
695                   }
696                 }
697               }
698             }
699           }
700         }
701       }
702     }
703   }
704   else if (s[0] == 's') {
705     if (s[1] == 'a') {
706       if (s[2] == 'm') {
707         if (s[3] == 'p') {
708           if (s[4] == 'l') {
709             if (s[5] == 'e') {
710               if (s[6] == 'r') {
711                 if (s[7] == '1') {
712                   if (s[8] == 'D') {
713                     return Parser::T_SAMPLER1D | Lexer::Variant_GLSL_120;
714                   }
715                 }
716                 else if (s[7] == '2') {
717                   if (s[8] == 'D') {
718                     return Parser::T_SAMPLER2D;
719                   }
720                 }
721                 else if (s[7] == '3') {
722                   if (s[8] == 'D') {
723                     return Parser::T_SAMPLER3D | Lexer::Variant_GLSL_120;
724                   }
725                 }
726               }
727             }
728           }
729         }
730       }
731     }
732   }
733   return Parser::T_IDENTIFIER;
734 }
735
736 static inline int classify10(const char *s) {
737   if (s[0] == 'i') {
738     if (s[1] == 's') {
739       if (s[2] == 'a') {
740         if (s[3] == 'm') {
741           if (s[4] == 'p') {
742             if (s[5] == 'l') {
743               if (s[6] == 'e') {
744                 if (s[7] == 'r') {
745                   if (s[8] == '1') {
746                     if (s[9] == 'D') {
747                       return Parser::T_ISAMPLER1D | Lexer::Variant_GLSL_150;
748                     }
749                   }
750                   else if (s[8] == '2') {
751                     if (s[9] == 'D') {
752                       return Parser::T_ISAMPLER2D | Lexer::Variant_GLSL_150;
753                     }
754                   }
755                   else if (s[8] == '3') {
756                     if (s[9] == 'D') {
757                       return Parser::T_ISAMPLER3D | Lexer::Variant_GLSL_150;
758                     }
759                   }
760                 }
761               }
762             }
763           }
764         }
765       }
766     }
767   }
768   else if (s[0] == 's') {
769     if (s[1] == 'u') {
770       if (s[2] == 'b') {
771         if (s[3] == 'r') {
772           if (s[4] == 'o') {
773             if (s[5] == 'u') {
774               if (s[6] == 't') {
775                 if (s[7] == 'i') {
776                   if (s[8] == 'n') {
777                     if (s[9] == 'e') {
778                       return Parser::T_SUBROUTINE | Lexer::Variant_GLSL_400;
779                     }
780                   }
781                 }
782               }
783             }
784           }
785         }
786       }
787     }
788   }
789   else if (s[0] == 'u') {
790     if (s[1] == 's') {
791       if (s[2] == 'a') {
792         if (s[3] == 'm') {
793           if (s[4] == 'p') {
794             if (s[5] == 'l') {
795               if (s[6] == 'e') {
796                 if (s[7] == 'r') {
797                   if (s[8] == '1') {
798                     if (s[9] == 'D') {
799                       return Parser::T_USAMPLER1D | Lexer::Variant_GLSL_150;
800                     }
801                   }
802                   else if (s[8] == '2') {
803                     if (s[9] == 'D') {
804                       return Parser::T_USAMPLER2D | Lexer::Variant_GLSL_150;
805                     }
806                   }
807                   else if (s[8] == '3') {
808                     if (s[9] == 'D') {
809                       return Parser::T_USAMPLER3D | Lexer::Variant_GLSL_150;
810                     }
811                   }
812                 }
813               }
814             }
815           }
816         }
817       }
818     }
819   }
820   return Parser::T_IDENTIFIER;
821 }
822
823 static inline int classify11(const char *s) {
824   if (s[0] == 's') {
825     if (s[1] == 'a') {
826       if (s[2] == 'm') {
827         if (s[3] == 'p') {
828           if (s[4] == 'l') {
829             if (s[5] == 'e') {
830               if (s[6] == 'r') {
831                 if (s[7] == '2') {
832                   if (s[8] == 'D') {
833                     if (s[9] == 'M') {
834                       if (s[10] == 'S') {
835                         return Parser::T_SAMPLER2DMS | Lexer::Variant_GLSL_150;
836                       }
837                     }
838                   }
839                 }
840                 else if (s[7] == 'C') {
841                   if (s[8] == 'u') {
842                     if (s[9] == 'b') {
843                       if (s[10] == 'e') {
844                         return Parser::T_SAMPLERCUBE;
845                       }
846                     }
847                   }
848                 }
849               }
850             }
851           }
852         }
853       }
854     }
855   }
856   return Parser::T_IDENTIFIER;
857 }
858
859 static inline int classify12(const char *s) {
860   if (s[0] == 'i') {
861     if (s[1] == 's') {
862       if (s[2] == 'a') {
863         if (s[3] == 'm') {
864           if (s[4] == 'p') {
865             if (s[5] == 'l') {
866               if (s[6] == 'e') {
867                 if (s[7] == 'r') {
868                   if (s[8] == '2') {
869                     if (s[9] == 'D') {
870                       if (s[10] == 'M') {
871                         if (s[11] == 'S') {
872                           return Parser::T_ISAMPLER2DMS | Lexer::Variant_GLSL_150;
873                         }
874                       }
875                     }
876                   }
877                   else if (s[8] == 'C') {
878                     if (s[9] == 'u') {
879                       if (s[10] == 'b') {
880                         if (s[11] == 'e') {
881                           return Parser::T_ISAMPLERCUBE | Lexer::Variant_GLSL_150;
882                         }
883                       }
884                     }
885                   }
886                 }
887               }
888             }
889           }
890         }
891       }
892     }
893   }
894   else if (s[0] == 'u') {
895     if (s[1] == 's') {
896       if (s[2] == 'a') {
897         if (s[3] == 'm') {
898           if (s[4] == 'p') {
899             if (s[5] == 'l') {
900               if (s[6] == 'e') {
901                 if (s[7] == 'r') {
902                   if (s[8] == '2') {
903                     if (s[9] == 'D') {
904                       if (s[10] == 'M') {
905                         if (s[11] == 'S') {
906                           return Parser::T_USAMPLER2DMS | Lexer::Variant_GLSL_150;
907                         }
908                       }
909                     }
910                   }
911                   else if (s[8] == 'C') {
912                     if (s[9] == 'u') {
913                       if (s[10] == 'b') {
914                         if (s[11] == 'e') {
915                           return Parser::T_USAMPLERCUBE | Lexer::Variant_GLSL_150;
916                         }
917                       }
918                     }
919                   }
920                 }
921               }
922             }
923           }
924         }
925       }
926     }
927   }
928   return Parser::T_IDENTIFIER;
929 }
930
931 static inline int classify13(const char *s) {
932   if (s[0] == 'n') {
933     if (s[1] == 'o') {
934       if (s[2] == 'p') {
935         if (s[3] == 'e') {
936           if (s[4] == 'r') {
937             if (s[5] == 's') {
938               if (s[6] == 'p') {
939                 if (s[7] == 'e') {
940                   if (s[8] == 'c') {
941                     if (s[9] == 't') {
942                       if (s[10] == 'i') {
943                         if (s[11] == 'v') {
944                           if (s[12] == 'e') {
945                             return Parser::T_NOPERSPECTIVE | Lexer::Variant_GLSL_150;
946                           }
947                         }
948                       }
949                     }
950                   }
951                 }
952               }
953             }
954           }
955         }
956       }
957     }
958   }
959   else if (s[0] == 's') {
960     if (s[1] == 'a') {
961       if (s[2] == 'm') {
962         if (s[3] == 'p') {
963           if (s[4] == 'l') {
964             if (s[5] == 'e') {
965               if (s[6] == 'r') {
966                 if (s[7] == '2') {
967                   if (s[8] == 'D') {
968                     if (s[9] == 'R') {
969                       if (s[10] == 'e') {
970                         if (s[11] == 'c') {
971                           if (s[12] == 't') {
972                             return Parser::T_SAMPLER2DRECT;
973                           }
974                         }
975                       }
976                     }
977                   }
978                 }
979                 else if (s[7] == 'B') {
980                   if (s[8] == 'u') {
981                     if (s[9] == 'f') {
982                       if (s[10] == 'f') {
983                         if (s[11] == 'e') {
984                           if (s[12] == 'r') {
985                             return Parser::T_SAMPLERBUFFER | Lexer::Variant_GLSL_150;
986                           }
987                         }
988                       }
989                     }
990                   }
991                 }
992               }
993             }
994           }
995         }
996       }
997     }
998   }
999   return Parser::T_IDENTIFIER;
1000 }
1001
1002 static inline int classify14(const char *s) {
1003   if (s[0] == 'i') {
1004     if (s[1] == 's') {
1005       if (s[2] == 'a') {
1006         if (s[3] == 'm') {
1007           if (s[4] == 'p') {
1008             if (s[5] == 'l') {
1009               if (s[6] == 'e') {
1010                 if (s[7] == 'r') {
1011                   if (s[8] == '2') {
1012                     if (s[9] == 'D') {
1013                       if (s[10] == 'R') {
1014                         if (s[11] == 'e') {
1015                           if (s[12] == 'c') {
1016                             if (s[13] == 't') {
1017                               return Parser::T_ISAMPLER2DRECT | Lexer::Variant_GLSL_150;
1018                             }
1019                           }
1020                         }
1021                       }
1022                     }
1023                   }
1024                   else if (s[8] == 'B') {
1025                     if (s[9] == 'u') {
1026                       if (s[10] == 'f') {
1027                         if (s[11] == 'f') {
1028                           if (s[12] == 'e') {
1029                             if (s[13] == 'r') {
1030                               return Parser::T_ISAMPLERBUFFER | Lexer::Variant_GLSL_150;
1031                             }
1032                           }
1033                         }
1034                       }
1035                     }
1036                   }
1037                 }
1038               }
1039             }
1040           }
1041         }
1042       }
1043     }
1044   }
1045   else if (s[0] == 's') {
1046     if (s[1] == 'a') {
1047       if (s[2] == 'm') {
1048         if (s[3] == 'p') {
1049           if (s[4] == 'l') {
1050             if (s[5] == 'e') {
1051               if (s[6] == 'r') {
1052                 if (s[7] == '1') {
1053                   if (s[8] == 'D') {
1054                     if (s[9] == 'A') {
1055                       if (s[10] == 'r') {
1056                         if (s[11] == 'r') {
1057                           if (s[12] == 'a') {
1058                             if (s[13] == 'y') {
1059                               return Parser::T_SAMPLER1DARRAY | Lexer::Variant_GLSL_150;
1060                             }
1061                           }
1062                         }
1063                       }
1064                     }
1065                   }
1066                 }
1067                 else if (s[7] == '2') {
1068                   if (s[8] == 'D') {
1069                     if (s[9] == 'A') {
1070                       if (s[10] == 'r') {
1071                         if (s[11] == 'r') {
1072                           if (s[12] == 'a') {
1073                             if (s[13] == 'y') {
1074                               return Parser::T_SAMPLER2DARRAY | Lexer::Variant_GLSL_150;
1075                             }
1076                           }
1077                         }
1078                       }
1079                     }
1080                   }
1081                 }
1082               }
1083             }
1084           }
1085         }
1086       }
1087     }
1088   }
1089   else if (s[0] == 'u') {
1090     if (s[1] == 's') {
1091       if (s[2] == 'a') {
1092         if (s[3] == 'm') {
1093           if (s[4] == 'p') {
1094             if (s[5] == 'l') {
1095               if (s[6] == 'e') {
1096                 if (s[7] == 'r') {
1097                   if (s[8] == '2') {
1098                     if (s[9] == 'D') {
1099                       if (s[10] == 'R') {
1100                         if (s[11] == 'e') {
1101                           if (s[12] == 'c') {
1102                             if (s[13] == 't') {
1103                               return Parser::T_USAMPLER2DRECT | Lexer::Variant_GLSL_150;
1104                             }
1105                           }
1106                         }
1107                       }
1108                     }
1109                   }
1110                   else if (s[8] == 'B') {
1111                     if (s[9] == 'u') {
1112                       if (s[10] == 'f') {
1113                         if (s[11] == 'f') {
1114                           if (s[12] == 'e') {
1115                             if (s[13] == 'r') {
1116                               return Parser::T_USAMPLERBUFFER | Lexer::Variant_GLSL_150;
1117                             }
1118                           }
1119                         }
1120                       }
1121                     }
1122                   }
1123                 }
1124               }
1125             }
1126           }
1127         }
1128       }
1129     }
1130   }
1131   return Parser::T_IDENTIFIER;
1132 }
1133
1134 static inline int classify15(const char *s) {
1135   if (s[0] == 'i') {
1136     if (s[1] == 's') {
1137       if (s[2] == 'a') {
1138         if (s[3] == 'm') {
1139           if (s[4] == 'p') {
1140             if (s[5] == 'l') {
1141               if (s[6] == 'e') {
1142                 if (s[7] == 'r') {
1143                   if (s[8] == '1') {
1144                     if (s[9] == 'D') {
1145                       if (s[10] == 'A') {
1146                         if (s[11] == 'r') {
1147                           if (s[12] == 'r') {
1148                             if (s[13] == 'a') {
1149                               if (s[14] == 'y') {
1150                                 return Parser::T_ISAMPLER1DARRAY | Lexer::Variant_GLSL_150;
1151                               }
1152                             }
1153                           }
1154                         }
1155                       }
1156                     }
1157                   }
1158                   else if (s[8] == '2') {
1159                     if (s[9] == 'D') {
1160                       if (s[10] == 'A') {
1161                         if (s[11] == 'r') {
1162                           if (s[12] == 'r') {
1163                             if (s[13] == 'a') {
1164                               if (s[14] == 'y') {
1165                                 return Parser::T_ISAMPLER2DARRAY | Lexer::Variant_GLSL_150;
1166                               }
1167                             }
1168                           }
1169                         }
1170                       }
1171                     }
1172                   }
1173                 }
1174               }
1175             }
1176           }
1177         }
1178       }
1179     }
1180   }
1181   else if (s[0] == 's') {
1182     if (s[1] == 'a') {
1183       if (s[2] == 'm') {
1184         if (s[3] == 'p') {
1185           if (s[4] == 'l') {
1186             if (s[5] == 'e') {
1187               if (s[6] == 'r') {
1188                 if (s[7] == '1') {
1189                   if (s[8] == 'D') {
1190                     if (s[9] == 'S') {
1191                       if (s[10] == 'h') {
1192                         if (s[11] == 'a') {
1193                           if (s[12] == 'd') {
1194                             if (s[13] == 'o') {
1195                               if (s[14] == 'w') {
1196                                 return Parser::T_SAMPLER1DSHADOW | Lexer::Variant_GLSL_120;
1197                               }
1198                             }
1199                           }
1200                         }
1201                       }
1202                     }
1203                   }
1204                 }
1205                 else if (s[7] == '2') {
1206                   if (s[8] == 'D') {
1207                     if (s[9] == 'S') {
1208                       if (s[10] == 'h') {
1209                         if (s[11] == 'a') {
1210                           if (s[12] == 'd') {
1211                             if (s[13] == 'o') {
1212                               if (s[14] == 'w') {
1213                                 return Parser::T_SAMPLER2DSHADOW | Lexer::Variant_GLSL_120;
1214                               }
1215                             }
1216                           }
1217                         }
1218                       }
1219                     }
1220                   }
1221                 }
1222               }
1223             }
1224           }
1225         }
1226       }
1227     }
1228   }
1229   else if (s[0] == 'u') {
1230     if (s[1] == 's') {
1231       if (s[2] == 'a') {
1232         if (s[3] == 'm') {
1233           if (s[4] == 'p') {
1234             if (s[5] == 'l') {
1235               if (s[6] == 'e') {
1236                 if (s[7] == 'r') {
1237                   if (s[8] == '1') {
1238                     if (s[9] == 'D') {
1239                       if (s[10] == 'A') {
1240                         if (s[11] == 'r') {
1241                           if (s[12] == 'r') {
1242                             if (s[13] == 'a') {
1243                               if (s[14] == 'y') {
1244                                 return Parser::T_USAMPLER1DARRAY | Lexer::Variant_GLSL_150;
1245                               }
1246                             }
1247                           }
1248                         }
1249                       }
1250                     }
1251                   }
1252                   else if (s[8] == '2') {
1253                     if (s[9] == 'D') {
1254                       if (s[10] == 'A') {
1255                         if (s[11] == 'r') {
1256                           if (s[12] == 'r') {
1257                             if (s[13] == 'a') {
1258                               if (s[14] == 'y') {
1259                                 return Parser::T_USAMPLER2DARRAY | Lexer::Variant_GLSL_150;
1260                               }
1261                             }
1262                           }
1263                         }
1264                       }
1265                     }
1266                   }
1267                 }
1268               }
1269             }
1270           }
1271         }
1272       }
1273     }
1274   }
1275   return Parser::T_IDENTIFIER;
1276 }
1277
1278 static inline int classify16(const char *s) {
1279   if (s[0] == 's') {
1280     if (s[1] == 'a') {
1281       if (s[2] == 'm') {
1282         if (s[3] == 'p') {
1283           if (s[4] == 'l') {
1284             if (s[5] == 'e') {
1285               if (s[6] == 'r') {
1286                 if (s[7] == '2') {
1287                   if (s[8] == 'D') {
1288                     if (s[9] == 'M') {
1289                       if (s[10] == 'S') {
1290                         if (s[11] == 'A') {
1291                           if (s[12] == 'r') {
1292                             if (s[13] == 'r') {
1293                               if (s[14] == 'a') {
1294                                 if (s[15] == 'y') {
1295                                   return Parser::T_SAMPLER2DMSARRAY | Lexer::Variant_GLSL_150;
1296                                 }
1297                               }
1298                             }
1299                           }
1300                         }
1301                       }
1302                     }
1303                   }
1304                 }
1305                 else if (s[7] == 'C') {
1306                   if (s[8] == 'u') {
1307                     if (s[9] == 'b') {
1308                       if (s[10] == 'e') {
1309                         if (s[11] == 'A') {
1310                           if (s[12] == 'r') {
1311                             if (s[13] == 'r') {
1312                               if (s[14] == 'a') {
1313                                 if (s[15] == 'y') {
1314                                   return Parser::T_SAMPLERCUBEARRAY | Lexer::Variant_GLSL_400;
1315                                 }
1316                               }
1317                             }
1318                           }
1319                         }
1320                       }
1321                     }
1322                   }
1323                 }
1324               }
1325             }
1326           }
1327         }
1328       }
1329     }
1330   }
1331   return Parser::T_IDENTIFIER;
1332 }
1333
1334 static inline int classify17(const char *s) {
1335   if (s[0] == 'i') {
1336     if (s[1] == 's') {
1337       if (s[2] == 'a') {
1338         if (s[3] == 'm') {
1339           if (s[4] == 'p') {
1340             if (s[5] == 'l') {
1341               if (s[6] == 'e') {
1342                 if (s[7] == 'r') {
1343                   if (s[8] == '2') {
1344                     if (s[9] == 'D') {
1345                       if (s[10] == 'M') {
1346                         if (s[11] == 'S') {
1347                           if (s[12] == 'A') {
1348                             if (s[13] == 'r') {
1349                               if (s[14] == 'r') {
1350                                 if (s[15] == 'a') {
1351                                   if (s[16] == 'y') {
1352                                     return Parser::T_ISAMPLER2DMSARRAY | Lexer::Variant_GLSL_150;
1353                                   }
1354                                 }
1355                               }
1356                             }
1357                           }
1358                         }
1359                       }
1360                     }
1361                   }
1362                   else if (s[8] == 'C') {
1363                     if (s[9] == 'u') {
1364                       if (s[10] == 'b') {
1365                         if (s[11] == 'e') {
1366                           if (s[12] == 'A') {
1367                             if (s[13] == 'r') {
1368                               if (s[14] == 'r') {
1369                                 if (s[15] == 'a') {
1370                                   if (s[16] == 'y') {
1371                                     return Parser::T_ISAMPLERCUBEARRAY | Lexer::Variant_GLSL_400;
1372                                   }
1373                                 }
1374                               }
1375                             }
1376                           }
1377                         }
1378                       }
1379                     }
1380                   }
1381                 }
1382               }
1383             }
1384           }
1385         }
1386       }
1387     }
1388   }
1389   else if (s[0] == 's') {
1390     if (s[1] == 'a') {
1391       if (s[2] == 'm') {
1392         if (s[3] == 'p') {
1393           if (s[4] == 'l') {
1394             if (s[5] == 'e') {
1395               if (s[6] == 'r') {
1396                 if (s[7] == 'C') {
1397                   if (s[8] == 'u') {
1398                     if (s[9] == 'b') {
1399                       if (s[10] == 'e') {
1400                         if (s[11] == 'S') {
1401                           if (s[12] == 'h') {
1402                             if (s[13] == 'a') {
1403                               if (s[14] == 'd') {
1404                                 if (s[15] == 'o') {
1405                                   if (s[16] == 'w') {
1406                                     return Parser::T_SAMPLERCUBESHADOW | Lexer::Variant_GLSL_400;
1407                                   }
1408                                 }
1409                               }
1410                             }
1411                           }
1412                         }
1413                       }
1414                     }
1415                   }
1416                 }
1417               }
1418             }
1419           }
1420         }
1421       }
1422     }
1423   }
1424   else if (s[0] == 'u') {
1425     if (s[1] == 's') {
1426       if (s[2] == 'a') {
1427         if (s[3] == 'm') {
1428           if (s[4] == 'p') {
1429             if (s[5] == 'l') {
1430               if (s[6] == 'e') {
1431                 if (s[7] == 'r') {
1432                   if (s[8] == '2') {
1433                     if (s[9] == 'D') {
1434                       if (s[10] == 'M') {
1435                         if (s[11] == 'S') {
1436                           if (s[12] == 'a') {
1437                             if (s[13] == 'r') {
1438                               if (s[14] == 'r') {
1439                                 if (s[15] == 'a') {
1440                                   if (s[16] == 'y') {
1441                                     return Parser::T_USAMPLER2DMSARRAY | Lexer::Variant_GLSL_150;
1442                                   }
1443                                 }
1444                               }
1445                             }
1446                           }
1447                         }
1448                       }
1449                     }
1450                   }
1451                   else if (s[8] == 'C') {
1452                     if (s[9] == 'u') {
1453                       if (s[10] == 'b') {
1454                         if (s[11] == 'e') {
1455                           if (s[12] == 'A') {
1456                             if (s[13] == 'r') {
1457                               if (s[14] == 'r') {
1458                                 if (s[15] == 'a') {
1459                                   if (s[16] == 'y') {
1460                                     return Parser::T_USAMPLERCUBEARRAY | Lexer::Variant_GLSL_400;
1461                                   }
1462                                 }
1463                               }
1464                             }
1465                           }
1466                         }
1467                       }
1468                     }
1469                   }
1470                 }
1471               }
1472             }
1473           }
1474         }
1475       }
1476     }
1477   }
1478   return Parser::T_IDENTIFIER;
1479 }
1480
1481 static inline int classify19(const char *s) {
1482   if (s[0] == 's') {
1483     if (s[1] == 'a') {
1484       if (s[2] == 'm') {
1485         if (s[3] == 'p') {
1486           if (s[4] == 'l') {
1487             if (s[5] == 'e') {
1488               if (s[6] == 'r') {
1489                 if (s[7] == '2') {
1490                   if (s[8] == 'D') {
1491                     if (s[9] == 'R') {
1492                       if (s[10] == 'e') {
1493                         if (s[11] == 'c') {
1494                           if (s[12] == 't') {
1495                             if (s[13] == 'S') {
1496                               if (s[14] == 'h') {
1497                                 if (s[15] == 'a') {
1498                                   if (s[16] == 'd') {
1499                                     if (s[17] == 'o') {
1500                                       if (s[18] == 'w') {
1501                                         return Parser::T_SAMPLER2DRECTSHADOW;
1502                                       }
1503                                     }
1504                                   }
1505                                 }
1506                               }
1507                             }
1508                           }
1509                         }
1510                       }
1511                     }
1512                   }
1513                 }
1514               }
1515             }
1516           }
1517         }
1518       }
1519     }
1520   }
1521   return Parser::T_IDENTIFIER;
1522 }
1523
1524 static inline int classify20(const char *s) {
1525   if (s[0] == 's') {
1526     if (s[1] == 'a') {
1527       if (s[2] == 'm') {
1528         if (s[3] == 'p') {
1529           if (s[4] == 'l') {
1530             if (s[5] == 'e') {
1531               if (s[6] == 'r') {
1532                 if (s[7] == '1') {
1533                   if (s[8] == 'D') {
1534                     if (s[9] == 'A') {
1535                       if (s[10] == 'r') {
1536                         if (s[11] == 'r') {
1537                           if (s[12] == 'a') {
1538                             if (s[13] == 'y') {
1539                               if (s[14] == 'S') {
1540                                 if (s[15] == 'h') {
1541                                   if (s[16] == 'a') {
1542                                     if (s[17] == 'd') {
1543                                       if (s[18] == 'o') {
1544                                         if (s[19] == 'w') {
1545                                           return Parser::T_SAMPLER1DARRAYSHADOW | Lexer::Variant_GLSL_150;
1546                                         }
1547                                       }
1548                                     }
1549                                   }
1550                                 }
1551                               }
1552                             }
1553                           }
1554                         }
1555                       }
1556                     }
1557                   }
1558                 }
1559                 else if (s[7] == '2') {
1560                   if (s[8] == 'D') {
1561                     if (s[9] == 'A') {
1562                       if (s[10] == 'r') {
1563                         if (s[11] == 'r') {
1564                           if (s[12] == 'a') {
1565                             if (s[13] == 'y') {
1566                               if (s[14] == 'S') {
1567                                 if (s[15] == 'h') {
1568                                   if (s[16] == 'a') {
1569                                     if (s[17] == 'd') {
1570                                       if (s[18] == 'o') {
1571                                         if (s[19] == 'w') {
1572                                           return Parser::T_SAMPLER2DARRAYSHADOW | Lexer::Variant_GLSL_150;
1573                                         }
1574                                       }
1575                                     }
1576                                   }
1577                                 }
1578                               }
1579                             }
1580                           }
1581                         }
1582                       }
1583                     }
1584                   }
1585                 }
1586               }
1587             }
1588           }
1589         }
1590       }
1591     }
1592   }
1593   return Parser::T_IDENTIFIER;
1594 }
1595
1596 static inline int classify22(const char *s) {
1597   if (s[0] == 's') {
1598     if (s[1] == 'a') {
1599       if (s[2] == 'm') {
1600         if (s[3] == 'p') {
1601           if (s[4] == 'l') {
1602             if (s[5] == 'e') {
1603               if (s[6] == 'r') {
1604                 if (s[7] == 'C') {
1605                   if (s[8] == 'u') {
1606                     if (s[9] == 'b') {
1607                       if (s[10] == 'e') {
1608                         if (s[11] == 'A') {
1609                           if (s[12] == 'r') {
1610                             if (s[13] == 'r') {
1611                               if (s[14] == 'a') {
1612                                 if (s[15] == 'y') {
1613                                   if (s[16] == 'S') {
1614                                     if (s[17] == 'h') {
1615                                       if (s[18] == 'a') {
1616                                         if (s[19] == 'd') {
1617                                           if (s[20] == 'o') {
1618                                             if (s[21] == 'w') {
1619                                               return Parser::T_SAMPLERCUBEARRAYSHADOW | Lexer::Variant_GLSL_400;
1620                                             }
1621                                           }
1622                                         }
1623                                       }
1624                                     }
1625                                   }
1626                                 }
1627                               }
1628                             }
1629                           }
1630                         }
1631                       }
1632                     }
1633                   }
1634                 }
1635               }
1636             }
1637           }
1638         }
1639       }
1640     }
1641   }
1642   return Parser::T_IDENTIFIER;
1643 }
1644
1645 int Lexer::classify(const char *s, int n) {
1646   switch (n) {
1647     case 2: return classify2(s);
1648     case 3: return classify3(s);
1649     case 4: return classify4(s);
1650     case 5: return classify5(s);
1651     case 6: return classify6(s);
1652     case 7: return classify7(s);
1653     case 8: return classify8(s);
1654     case 9: return classify9(s);
1655     case 10: return classify10(s);
1656     case 11: return classify11(s);
1657     case 12: return classify12(s);
1658     case 13: return classify13(s);
1659     case 14: return classify14(s);
1660     case 15: return classify15(s);
1661     case 16: return classify16(s);
1662     case 17: return classify17(s);
1663     case 19: return classify19(s);
1664     case 20: return classify20(s);
1665     case 22: return classify22(s);
1666     default: return Parser::T_IDENTIFIER;
1667   } // switch
1668 }
1669
1670 QStringList Lexer::keywords(int variant) {
1671   QStringList list;
1672   list += QLatin1String("do");
1673   list += QLatin1String("if");
1674   list += QLatin1String("in");
1675   list += QLatin1String("for");
1676   list += QLatin1String("int");
1677   list += QLatin1String("out");
1678   list += QLatin1String("bool");
1679   if (variant & (Lexer::Variant_GLSL_150))
1680     list += QLatin1String("case");
1681   list += QLatin1String("else");
1682   if (variant & (Lexer::Variant_GLSL_150))
1683     list += QLatin1String("flat");
1684   if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400))
1685     list += QLatin1String("lowp");
1686   list += QLatin1String("mat2");
1687   list += QLatin1String("mat3");
1688   list += QLatin1String("mat4");
1689   if (variant & (Lexer::Variant_GLSL_150))
1690     list += QLatin1String("uint");
1691   list += QLatin1String("vec2");
1692   list += QLatin1String("vec3");
1693   list += QLatin1String("vec4");
1694   list += QLatin1String("void");
1695   list += QLatin1String("true");
1696   list += QLatin1String("break");
1697   list += QLatin1String("bvec2");
1698   list += QLatin1String("bvec3");
1699   list += QLatin1String("bvec4");
1700   list += QLatin1String("const");
1701   if (variant & (Lexer::Variant_GLSL_400))
1702     list += QLatin1String("dmat2");
1703   if (variant & (Lexer::Variant_GLSL_400))
1704     list += QLatin1String("dmat3");
1705   if (variant & (Lexer::Variant_GLSL_400))
1706     list += QLatin1String("dmat4");
1707   if (variant & (Lexer::Variant_GLSL_400))
1708     list += QLatin1String("dvec2");
1709   if (variant & (Lexer::Variant_GLSL_400))
1710     list += QLatin1String("dvec3");
1711   if (variant & (Lexer::Variant_GLSL_400))
1712     list += QLatin1String("dvec4");
1713   list += QLatin1String("float");
1714   if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400))
1715     list += QLatin1String("highp");
1716   list += QLatin1String("inout");
1717   list += QLatin1String("ivec2");
1718   list += QLatin1String("ivec3");
1719   list += QLatin1String("ivec4");
1720   if (variant & (Lexer::Variant_GLSL_400))
1721     list += QLatin1String("patch");
1722   if (variant & (Lexer::Variant_GLSL_150))
1723     list += QLatin1String("uvec2");
1724   if (variant & (Lexer::Variant_GLSL_150))
1725     list += QLatin1String("uvec3");
1726   if (variant & (Lexer::Variant_GLSL_150))
1727     list += QLatin1String("uvec4");
1728   list += QLatin1String("while");
1729   list += QLatin1String("false");
1730   if (variant & (Lexer::Variant_GLSL_400))
1731     list += QLatin1String("double");
1732   if (variant & (Lexer::Variant_GLSL_150))
1733     list += QLatin1String("layout");
1734   if (variant & (Lexer::Variant_GLSL_120))
1735     list += QLatin1String("mat2x2");
1736   if (variant & (Lexer::Variant_GLSL_120))
1737     list += QLatin1String("mat2x3");
1738   if (variant & (Lexer::Variant_GLSL_120))
1739     list += QLatin1String("mat2x4");
1740   if (variant & (Lexer::Variant_GLSL_120))
1741     list += QLatin1String("mat3x2");
1742   if (variant & (Lexer::Variant_GLSL_120))
1743     list += QLatin1String("mat3x3");
1744   if (variant & (Lexer::Variant_GLSL_120))
1745     list += QLatin1String("mat3x4");
1746   if (variant & (Lexer::Variant_GLSL_120))
1747     list += QLatin1String("mat4x2");
1748   if (variant & (Lexer::Variant_GLSL_120))
1749     list += QLatin1String("mat4x3");
1750   if (variant & (Lexer::Variant_GLSL_120))
1751     list += QLatin1String("mat4x4");
1752   list += QLatin1String("return");
1753   if (variant & (Lexer::Variant_Reserved))
1754     list += QLatin1String("sample");
1755   if (variant & (Lexer::Variant_GLSL_150))
1756     list += QLatin1String("smooth");
1757   list += QLatin1String("struct");
1758   if (variant & (Lexer::Variant_GLSL_150))
1759     list += QLatin1String("switch");
1760   if (variant & (Lexer::Variant_GLSL_150))
1761     list += QLatin1String("default");
1762   if (variant & (Lexer::Variant_FragmentShader))
1763     list += QLatin1String("discard");
1764   if (variant & (Lexer::Variant_GLSL_400))
1765     list += QLatin1String("dmat2x2");
1766   if (variant & (Lexer::Variant_GLSL_400))
1767     list += QLatin1String("dmat2x3");
1768   if (variant & (Lexer::Variant_GLSL_400))
1769     list += QLatin1String("dmat2x4");
1770   if (variant & (Lexer::Variant_GLSL_400))
1771     list += QLatin1String("dmat3x2");
1772   if (variant & (Lexer::Variant_GLSL_400))
1773     list += QLatin1String("dmat3x3");
1774   if (variant & (Lexer::Variant_GLSL_400))
1775     list += QLatin1String("dmat3x4");
1776   if (variant & (Lexer::Variant_GLSL_400))
1777     list += QLatin1String("dmat4x2");
1778   if (variant & (Lexer::Variant_GLSL_400))
1779     list += QLatin1String("dmat4x3");
1780   if (variant & (Lexer::Variant_GLSL_400))
1781     list += QLatin1String("dmat4x4");
1782   if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400))
1783     list += QLatin1String("mediump");
1784   list += QLatin1String("uniform");
1785   list += QLatin1String("varying");
1786   if (variant & (Lexer::Variant_GLSL_120))
1787     list += QLatin1String("centroid");
1788   list += QLatin1String("continue");
1789   if (variant & (Lexer::Variant_VertexShader))
1790     list += QLatin1String("attribute");
1791   list += QLatin1String("invariant");
1792   if (variant & (Lexer::Variant_GLSL_ES_100))
1793     list += QLatin1String("precision");
1794   if (variant & (Lexer::Variant_GLSL_120))
1795     list += QLatin1String("sampler1D");
1796   list += QLatin1String("sampler2D");
1797   if (variant & (Lexer::Variant_GLSL_120))
1798     list += QLatin1String("sampler3D");
1799   if (variant & (Lexer::Variant_GLSL_150))
1800     list += QLatin1String("isampler1D");
1801   if (variant & (Lexer::Variant_GLSL_150))
1802     list += QLatin1String("isampler2D");
1803   if (variant & (Lexer::Variant_GLSL_150))
1804     list += QLatin1String("isampler3D");
1805   if (variant & (Lexer::Variant_GLSL_400))
1806     list += QLatin1String("subroutine");
1807   if (variant & (Lexer::Variant_GLSL_150))
1808     list += QLatin1String("usampler1D");
1809   if (variant & (Lexer::Variant_GLSL_150))
1810     list += QLatin1String("usampler2D");
1811   if (variant & (Lexer::Variant_GLSL_150))
1812     list += QLatin1String("usampler3D");
1813   if (variant & (Lexer::Variant_GLSL_150))
1814     list += QLatin1String("sampler2DMS");
1815   list += QLatin1String("samplerCube");
1816   if (variant & (Lexer::Variant_GLSL_150))
1817     list += QLatin1String("isampler2DMS");
1818   if (variant & (Lexer::Variant_GLSL_150))
1819     list += QLatin1String("isamplerCube");
1820   if (variant & (Lexer::Variant_GLSL_150))
1821     list += QLatin1String("usampler2DMS");
1822   if (variant & (Lexer::Variant_GLSL_150))
1823     list += QLatin1String("usamplerCube");
1824   if (variant & (Lexer::Variant_GLSL_150))
1825     list += QLatin1String("noperspective");
1826   list += QLatin1String("sampler2DRect");
1827   if (variant & (Lexer::Variant_GLSL_150))
1828     list += QLatin1String("samplerBuffer");
1829   if (variant & (Lexer::Variant_GLSL_150))
1830     list += QLatin1String("isampler2DRect");
1831   if (variant & (Lexer::Variant_GLSL_150))
1832     list += QLatin1String("isamplerBuffer");
1833   if (variant & (Lexer::Variant_GLSL_150))
1834     list += QLatin1String("sampler1DArray");
1835   if (variant & (Lexer::Variant_GLSL_150))
1836     list += QLatin1String("sampler2DArray");
1837   if (variant & (Lexer::Variant_GLSL_150))
1838     list += QLatin1String("usampler2DRect");
1839   if (variant & (Lexer::Variant_GLSL_150))
1840     list += QLatin1String("usamplerBuffer");
1841   if (variant & (Lexer::Variant_GLSL_150))
1842     list += QLatin1String("isampler1DArray");
1843   if (variant & (Lexer::Variant_GLSL_150))
1844     list += QLatin1String("isampler2DArray");
1845   if (variant & (Lexer::Variant_GLSL_120))
1846     list += QLatin1String("sampler1DShadow");
1847   if (variant & (Lexer::Variant_GLSL_120))
1848     list += QLatin1String("sampler2DShadow");
1849   if (variant & (Lexer::Variant_GLSL_150))
1850     list += QLatin1String("usampler1DArray");
1851   if (variant & (Lexer::Variant_GLSL_150))
1852     list += QLatin1String("usampler2DArray");
1853   if (variant & (Lexer::Variant_GLSL_150))
1854     list += QLatin1String("sampler2DMSArray");
1855   if (variant & (Lexer::Variant_GLSL_400))
1856     list += QLatin1String("samplerCubeArray");
1857   if (variant & (Lexer::Variant_GLSL_150))
1858     list += QLatin1String("isampler2DMSArray");
1859   if (variant & (Lexer::Variant_GLSL_400))
1860     list += QLatin1String("isamplerCubeArray");
1861   if (variant & (Lexer::Variant_GLSL_400))
1862     list += QLatin1String("samplerCubeShadow");
1863   if (variant & (Lexer::Variant_GLSL_150))
1864     list += QLatin1String("usampler2DMSarray");
1865   if (variant & (Lexer::Variant_GLSL_400))
1866     list += QLatin1String("usamplerCubeArray");
1867   list += QLatin1String("sampler2DRectShadow");
1868   if (variant & (Lexer::Variant_GLSL_150))
1869     list += QLatin1String("sampler1DArrayShadow");
1870   if (variant & (Lexer::Variant_GLSL_150))
1871     list += QLatin1String("sampler2DArrayShadow");
1872   if (variant & (Lexer::Variant_GLSL_400))
1873     list += QLatin1String("samplerCubeArrayShadow");
1874   return list;
1875 }
1876