OSDN Git Service

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