// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "glsllexer.h"
#include "glslparser.h"


using namespace GLSL;

static inline int classify2(const char *s) {
  if (s[0] == 'd') {
    if (s[1] == 'o') {
      return Parser::T_DO;
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'f') {
      return Parser::T_IF;
    }
    else if (s[1] == 'n') {
      return Parser::T_IN;
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify3(const char *s) {
  if (s[0] == 'f') {
    if (s[1] == 'o') {
      if (s[2] == 'r') {
        return Parser::T_FOR;
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'n') {
      if (s[2] == 't') {
        return Parser::T_INT;
      }
    }
  }
  else if (s[0] == 'o') {
    if (s[1] == 'u') {
      if (s[2] == 't') {
        return Parser::T_OUT;
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify4(const char *s) {
  if (s[0] == 'b') {
    if (s[1] == 'o') {
      if (s[2] == 'o') {
        if (s[3] == 'l') {
          return Parser::T_BOOL;
        }
      }
    }
  }
  else if (s[0] == 'c') {
    if (s[1] == 'a') {
      if (s[2] == 's') {
        if (s[3] == 'e') {
          return Parser::T_CASE | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
        }
      }
    }
  }
  else if (s[0] == 'e') {
    if (s[1] == 'l') {
      if (s[2] == 's') {
        if (s[3] == 'e') {
          return Parser::T_ELSE;
        }
      }
    }
  }
  else if (s[0] == 'f') {
    if (s[1] == 'l') {
      if (s[2] == 'a') {
        if (s[3] == 't') {
          return Parser::T_FLAT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
        }
      }
    }
  }
  else if (s[0] == 'l') {
    if (s[1] == 'o') {
      if (s[2] == 'w') {
        if (s[3] == 'p') {
          return Parser::T_LOWP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
        }
      }
    }
  }
  else if (s[0] == 'm') {
    if (s[1] == 'a') {
      if (s[2] == 't') {
        if (s[3] == '2') {
          return Parser::T_MAT2;
        }
        else if (s[3] == '3') {
          return Parser::T_MAT3;
        }
        else if (s[3] == '4') {
          return Parser::T_MAT4;
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'r') {
      if (s[2] == 'u') {
        if (s[3] == 'e') {
          return Parser::T_TRUE;
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'n') {
        if (s[3] == 't') {
          return Parser::T_UINT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
        }
      }
    }
  }
  else if (s[0] == 'v') {
    if (s[1] == 'e') {
      if (s[2] == 'c') {
        if (s[3] == '2') {
          return Parser::T_VEC2;
        }
        else if (s[3] == '3') {
          return Parser::T_VEC3;
        }
        else if (s[3] == '4') {
          return Parser::T_VEC4;
        }
      }
    }
    else if (s[1] == 'o') {
      if (s[2] == 'i') {
        if (s[3] == 'd') {
          return Parser::T_VOID;
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify5(const char *s) {
  if (s[0] == 'b') {
    if (s[1] == 'r') {
      if (s[2] == 'e') {
        if (s[3] == 'a') {
          if (s[4] == 'k') {
            return Parser::T_BREAK;
          }
        }
      }
    }
    else if (s[1] == 'v') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == '2') {
            return Parser::T_BVEC2;
          }
          else if (s[4] == '3') {
            return Parser::T_BVEC3;
          }
          else if (s[4] == '4') {
            return Parser::T_BVEC4;
          }
        }
      }
    }
  }
  else if (s[0] == 'c') {
    if (s[1] == 'o') {
      if (s[2] == 'n') {
        if (s[3] == 's') {
          if (s[4] == 't') {
            return Parser::T_CONST;
          }
        }
      }
    }
  }
  else if (s[0] == 'd') {
    if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 't') {
          if (s[4] == '2') {
            return Parser::T_DMAT2 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '3') {
            return Parser::T_DMAT3 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '4') {
            return Parser::T_DMAT4 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
        }
      }
    }
    else if (s[1] == 'v') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == '2') {
            return Parser::T_DVEC2 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '3') {
            return Parser::T_DVEC3 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '4') {
            return Parser::T_DVEC4 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
        }
      }
    }
  }
  else if (s[0] == 'f') {
    if (s[1] == 'a') {
      if (s[2] == 'l') {
        if (s[3] == 's') {
          if (s[4] == 'e') {
            return Parser::T_FALSE;
          }
        }
      }
    }
    else if (s[1] == 'l') {
      if (s[2] == 'o') {
        if (s[3] == 'a') {
          if (s[4] == 't') {
            return Parser::T_FLOAT;
          }
        }
      }
    }
  }
  else if (s[0] == 'h') {
    if (s[1] == 'i') {
      if (s[2] == 'g') {
        if (s[3] == 'h') {
          if (s[4] == 'p') {
            return Parser::T_HIGHP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
        }
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'n') {
      if (s[2] == 'o') {
        if (s[3] == 'u') {
          if (s[4] == 't') {
            return Parser::T_INOUT;
          }
        }
      }
    }
    else if (s[1] == 'v') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == '2') {
            return Parser::T_IVEC2;
          }
          else if (s[4] == '3') {
            return Parser::T_IVEC3;
          }
          else if (s[4] == '4') {
            return Parser::T_IVEC4;
          }
        }
      }
    }
  }
  else if (s[0] == 'p') {
    if (s[1] == 'a') {
      if (s[2] == 't') {
        if (s[3] == 'c') {
          if (s[4] == 'h') {
            return Parser::T_PATCH | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'v') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == '2') {
            return Parser::T_UVEC2 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '3') {
            return Parser::T_UVEC3 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
          else if (s[4] == '4') {
            return Parser::T_UVEC4 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
          }
        }
      }
    }
  }
  else if (s[0] == 'w') {
    if (s[1] == 'h') {
      if (s[2] == 'i') {
        if (s[3] == 'l') {
          if (s[4] == 'e') {
            return Parser::T_WHILE;
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify6(const char *s) {
    if (s[0] == 'b') {
        if (s[1] == 'u') {
            if (s[2] == 'f') {
                if (s[3] == 'f') {
                    if (s[4] == 'e') {
                        if (s[5] == 'r') {
                            return Parser::T_BUFFER | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                        }
                    }
                }
            }
        }
    }
    else if (s[0] == 'd') {
    if (s[1] == 'o') {
      if (s[2] == 'u') {
        if (s[3] == 'b') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              return Parser::T_DOUBLE | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'l') {
    if (s[1] == 'a') {
      if (s[2] == 'y') {
        if (s[3] == 'o') {
          if (s[4] == 'u') {
            if (s[5] == 't') {
              return Parser::T_LAYOUT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'm') {
    if (s[1] == 'a') {
      if (s[2] == 't') {
        if (s[3] == '2') {
          if (s[4] == 'x') {
            if (s[5] == '2') {
              return Parser::T_MAT2X2 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '3') {
              return Parser::T_MAT2X3 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '4') {
              return Parser::T_MAT2X4 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400;
            }
          }
        }
        else if (s[3] == '3') {
          if (s[4] == 'x') {
            if (s[5] == '2') {
              return Parser::T_MAT3X2 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '3') {
              return Parser::T_MAT3X3 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '4') {
              return Parser::T_MAT3X4 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
        else if (s[3] == '4') {
          if (s[4] == 'x') {
            if (s[5] == '2') {
              return Parser::T_MAT4X2 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '3') {
              return Parser::T_MAT4X3 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
            else if (s[5] == '4') {
              return Parser::T_MAT4X4 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'r') {
    if (s[1] == 'e') {
      if (s[2] == 't') {
        if (s[3] == 'u') {
          if (s[4] == 'r') {
            if (s[5] == 'n') {
              return Parser::T_RETURN;
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              return Parser::T_SAMPLE | Lexer::Variant_Reserved;
            }
          }
        }
      }
    }
    else if (s[1] == 'h') {
      if (s[2] == 'a') {
        if (s[3] == 'r') {
          if (s[4] == 'e') {
            if (s[5] == 'd') {
              return Parser::T_SHARED | Lexer::Variant_GLSL_400;
            }
          }
        }
      }
    }
    else if (s[1] == 'm') {
      if (s[2] == 'o') {
        if (s[3] == 'o') {
          if (s[4] == 't') {
            if (s[5] == 'h') {
              return Parser::T_SMOOTH | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'r') {
        if (s[3] == 'u') {
          if (s[4] == 'c') {
            if (s[5] == 't') {
              return Parser::T_STRUCT;
            }
          }
        }
      }
    }
    else if (s[1] == 'w') {
      if (s[2] == 'i') {
        if (s[3] == 't') {
          if (s[4] == 'c') {
            if (s[5] == 'h') {
              return Parser::T_SWITCH | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify7(const char *s) {
  if (s[0] == 'd') {
    if (s[1] == 'e') {
      if (s[2] == 'f') {
        if (s[3] == 'a') {
          if (s[4] == 'u') {
            if (s[5] == 'l') {
              if (s[6] == 't') {
                return Parser::T_DEFAULT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'i') {
      if (s[2] == 's') {
        if (s[3] == 'c') {
          if (s[4] == 'a') {
            if (s[5] == 'r') {
              if (s[6] == 'd') {
                return Parser::T_DISCARD | Lexer::Variant_FragmentShader;
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 't') {
          if (s[4] == '2') {
            if (s[5] == 'x') {
              if (s[6] == '2') {
                return Parser::T_DMAT2X2 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '3') {
                return Parser::T_DMAT2X3 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '4') {
                return Parser::T_DMAT2X4 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
          else if (s[4] == '3') {
            if (s[5] == 'x') {
              if (s[6] == '2') {
                return Parser::T_DMAT3X2 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '3') {
                return Parser::T_DMAT3X3 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '4') {
                return Parser::T_DMAT3X4 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
          else if (s[4] == '4') {
            if (s[5] == 'x') {
              if (s[6] == '2') {
                return Parser::T_DMAT4X2 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '3') {
                return Parser::T_DMAT4X3 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
              else if (s[6] == '4') {
                return Parser::T_DMAT4X4 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 'g') {
          if (s[4] == 'e') {
            if (s[5] == '1') {
              if (s[6] == 'D') {
                return Parser::T_IMAGE1D | Lexer::Variant_GLSL_460; // 420
              }
            }
            else if (s[5] == '2') {
              if (s[6] == 'D') {
                return Parser::T_IMAGE2D | Lexer::Variant_GLSL_460; // 420
              }
            }
            else if (s[5] == '3') {
              if (s[6] == 'D') {
                return Parser::T_IMAGE3D | Lexer::Variant_GLSL_460; // 420
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'm') {
    if (s[1] == 'e') {
      if (s[2] == 'd') {
        if (s[3] == 'i') {
          if (s[4] == 'u') {
            if (s[5] == 'm') {
              if (s[6] == 'p') {
                return Parser::T_MEDIUMP | Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'p') {
    if (s[1] == 'r') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == 'i') {
            if (s[5] == 's') {
              if (s[6] == 'e') {
                return Parser::T_PRECISE | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                  return Parser::T_SAMPLER | Lexer::Variant_Vulkan;
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'n') {
      if (s[2] == 'i') {
        if (s[3] == 'f') {
          if (s[4] == 'o') {
            if (s[5] == 'r') {
              if (s[6] == 'm') {
                return Parser::T_UNIFORM;
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'v') {
    if (s[1] == 'a') {
      if (s[2] == 'r') {
        if (s[3] == 'y') {
          if (s[4] == 'i') {
            if (s[5] == 'n') {
              if (s[6] == 'g') {
                return Parser::T_VARYING;
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify8(const char *s) {
  if (s[0] == 'c') {
    if (s[1] == 'e') {
      if (s[2] == 'n') {
        if (s[3] == 't') {
          if (s[4] == 'r') {
            if (s[5] == 'o') {
              if (s[6] == 'i') {
                if (s[7] == 'd') {
                  return Parser::T_CENTROID | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'o') {
      if (s[2] == 'h') {
          if (s[3] == 'e') {
            if (s[4] == 'r') {
              if (s[5] == 'e') {
                if (s[6] == 'n') {
                  if (s[7] == 't') {
                    return Parser::T_COHERENT | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                  }
                }
              }
            }
          }
      } else if (s[2] == 'n') {
        if (s[3] == 't') {
          if (s[4] == 'i') {
            if (s[5] == 'n') {
              if (s[6] == 'u') {
                if (s[7] == 'e') {
                  return Parser::T_CONTINUE;
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '1') {
                if (s[7] == 'D') {
                  return Parser::T_IIMAGE1D | Lexer::Variant_GLSL_460; // 420
                }
              }
              else if (s[6] == '2') {
                if (s[7] == 'D') {
                  return Parser::T_IIMAGE2D | Lexer::Variant_GLSL_460; // 420
                }
              }
              else if (s[6] == '3') {
                if (s[7] == 'D') {
                  return Parser::T_IIMAGE3D | Lexer::Variant_GLSL_460; // 420
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'r') {
    if (s[1] == 'e') {
      if (s[2] == 'a') {
        if (s[3] == 'd') {
          if (s[4] == 'o') {
            if (s[5] == 'n') {
              if (s[6] == 'l') {
                if (s[7] == 'y') {
                  return Parser::T_READONLY | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                }
              }
            }
          }
        }
      } else if (s[2] == 's') {
        if (s[3] == 't') {
          if (s[4] == 'r') {
            if (s[5] == 'i') {
              if (s[6] == 'c') {
                if (s[7] == 't') {
                  return Parser::T_RESTRICT | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '1') {
                if (s[7] == 'D') {
                  return Parser::T_UIMAGE1D | Lexer::Variant_GLSL_460; // 420
                }
              }
              else if (s[6] == '2') {
                if (s[7] == 'D') {
                  return Parser::T_UIMAGE2D | Lexer::Variant_GLSL_460; // 420
                }
              }
              else if (s[6] == '3') {
                if (s[7] == 'D') {
                  return Parser::T_UIMAGE3D | Lexer::Variant_GLSL_460; // 420
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'v') {
    if (s[1] == 'o') {
      if (s[2] == 'l') {
        if (s[3] == 'a') {
          if (s[4] == 't') {
            if (s[5] == 'i') {
              if (s[6] == 'l') {
                if (s[7] == 'e') {
                  return Parser::T_VOLATILE | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify9(const char *s) {
  if (s[0] == 'a') {
    if (s[1] == 't') {
      if (s[2] == 't') {
        if (s[3] == 'r') {
          if (s[4] == 'i') {
            if (s[5] == 'b') {
              if (s[6] == 'u') {
                if (s[7] == 't') {
                  if (s[8] == 'e') {
                    return Parser::T_ATTRIBUTE | Lexer::Variant_VertexShader;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 'g') {
          if (s[4] == 'e') {
            if (s[5] == '2') {
              if (s[6] == 'D') {
                if (s[7] == 'M') {
                  if (s[8] == 'S') {
                    return Parser::T_IMAGE2DMS | Lexer::Variant_GLSL_460; // 420
                  }
                }
              }
            }
            else if (s[5] == 'C') {
              if (s[6] == 'u') {
                if (s[7] == 'b') {
                  if (s[8] == 'e') {
                    return Parser::T_IMAGECUBE | Lexer::Variant_GLSL_460; // 420
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'n') {
      if (s[2] == 'v') {
        if (s[3] == 'a') {
          if (s[4] == 'r') {
            if (s[5] == 'i') {
              if (s[6] == 'a') {
                if (s[7] == 'n') {
                  if (s[8] == 't') {
                    return Parser::T_INVARIANT;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'p') {
    if (s[1] == 'r') {
      if (s[2] == 'e') {
        if (s[3] == 'c') {
          if (s[4] == 'i') {
            if (s[5] == 's') {
              if (s[6] == 'i') {
                if (s[7] == 'o') {
                  if (s[8] == 'n') {
                    return Parser::T_PRECISION | Lexer::Variant_GLSL_ES_100;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    return Parser::T_SAMPLER1D | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    return Parser::T_SAMPLER2D | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                  }
                }
                else if (s[7] == '3') {
                  if (s[8] == 'D') {
                    return Parser::T_SAMPLER3D | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'e') {
      if (s[2] == 'x') {
        if (s[3] == 't') {
          if (s[4] == 'u') {
            if (s[5] == 'r') {
              if (s[6] == 'e') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    return Parser::T_TEXTURE1D | Lexer::Variant_Vulkan;
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    return Parser::T_TEXTURE2D | Lexer::Variant_Vulkan;
                  }
                }
                else if (s[7] == '3') {
                  if (s[8] == 'D') {
                    return Parser::T_TEXTURE3D | Lexer::Variant_Vulkan;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'w') {
    if (s[1] == 'r') {
      if (s[2] == 'i') {
        if (s[3] == 't') {
          if (s[4] == 'e') {
            if (s[5] == 'o') {
              if (s[6] == 'n') {
                if (s[7] == 'l') {
                  if (s[8] == 'y') {
                    return Parser::T_WRITEONLY | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify10(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'M') {
                    if (s[9] == 'S') {
                      return Parser::T_IIMAGE2DMS | Lexer::Variant_GLSL_460; // 420
                    }
                  }
                }
              }
              else if (s[6] == 'C') {
                if (s[7] == 'u') {
                  if (s[8] == 'b') {
                    if (s[9] == 'e') {
                      return Parser::T_IIMAGECUBE | Lexer::Variant_GLSL_460; // 420
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      return Parser::T_ISAMPLER1D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      return Parser::T_ISAMPLER2D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                  else if (s[8] == '3') {
                    if (s[9] == 'D') {
                      return Parser::T_ISAMPLER3D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      return Parser::T_ITEXTURE1D | Lexer::Variant_Vulkan;
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      return Parser::T_ITEXTURE2D | Lexer::Variant_Vulkan;
                    }
                  }
                  else if (s[8] == '3') {
                    if (s[9] == 'D') {
                      return Parser::T_ITEXTURE3D | Lexer::Variant_Vulkan;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'u') {
      if (s[2] == 'b') {
        if (s[3] == 'r') {
          if (s[4] == 'o') {
            if (s[5] == 'u') {
              if (s[6] == 't') {
                if (s[7] == 'i') {
                  if (s[8] == 'n') {
                    if (s[9] == 'e') {
                      return Parser::T_SUBROUTINE | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'M') {
                    if (s[9] == 'S') {
                      return Parser::T_UIMAGE2DMS | Lexer::Variant_GLSL_460; // 420
                    }
                  }
                }
              }
              else if (s[6] == 'C') {
                if (s[7] == 'u') {
                  if (s[8] == 'b') {
                    if (s[9] == 'e') {
                      return Parser::T_UIMAGECUBE | Lexer::Variant_GLSL_460; //420
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      return Parser::T_USAMPLER1D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      return Parser::T_USAMPLER2D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                  else if (s[8] == '3') {
                    if (s[9] == 'D') {
                      return Parser::T_USAMPLER3D | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      return Parser::T_UTEXTURE1D | Lexer::Variant_Vulkan;
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      return Parser::T_UTEXTURE2D | Lexer::Variant_Vulkan;
                    }
                  }
                  else if (s[8] == '3') {
                    if (s[9] == 'D') {
                      return Parser::T_UTEXTURE3D | Lexer::Variant_Vulkan;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify11(const char *s) {
  if (s[0] == 'a') {
    if (s[1] == 't') {
      if (s[2] == 'o') {
        if (s[3] == 'm') {
          if (s[4] == 'i') {
            if (s[5] == 'c') {
              if (s[6] == '_') {
                if (s[7] == 'u') {
                  if (s[8] == 'i') {
                    if (s[9] == 'n') {
                      if (s[10] == 't') {
                        return Parser::T_ATOMIC_UINT | Lexer::Variant_GLSL_460; // 420
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'i') {
    if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 'g') {
          if (s[4] == 'e') {
            if (s[5] == '2') {
              if (s[6] == 'D') {
                if (s[7] == 'R') {
                  if (s[8] == 'e') {
                    if (s[9] == 'c') {
                      if (s[10] == 't') {
                        return Parser::T_IMAGE2DRECT | Lexer::Variant_GLSL_460; // 420
                      }
                    }
                  }
                }
              }
            }
            else if (s[5] == 'B') {
              if (s[6] == 'u') {
                if (s[7] == 'f') {
                  if (s[8] == 'f') {
                    if (s[9] == 'e') {
                      if (s[10] == 'r') {
                        return Parser::T_IMAGEBUFFER | Lexer::Variant_GLSL_460; // 420
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'M') {
                      if (s[10] == 'S') {
                        return Parser::T_SAMPLER2DMS | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                      }
                    }
                  }
                }
                else if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        return Parser::T_SAMPLERCUBE | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'e') {
      if (s[2] == 'x') {
        if (s[3] == 't') {
          if (s[4] == 'u') {
            if (s[5] == 'r') {
              if (s[6] == 'e') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'M') {
                      if (s[10] == 'S') {
                        return Parser::T_TEXTURE2DMS | Lexer::Variant_Vulkan;
                      }
                    }
                  }
                }
                else if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        return Parser::T_TEXTURECUBE | Lexer::Variant_Vulkan;
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify12(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'R') {
                    if (s[9] == 'e') {
                      if (s[10] == 'c') {
                        if (s[11] == 't') {
                          return Parser::T_IIMAGE2DRECT | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == 'B') {
                if (s[7] == 'u') {
                  if (s[8] == 'f') {
                    if (s[9] == 'f') {
                      if (s[10] == 'e') {
                        if (s[11] == 'r') {
                          return Parser::T_IIMAGEBUFFER | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 'g') {
          if (s[4] == 'e') {
            if (s[5] == '1') {
              if (s[6] == 'D') {
                if (s[7] == 'A') {
                  if (s[8] == 'r') {
                    if (s[9] == 'r') {
                      if (s[10] == 'a') {
                        if (s[11] == 'y') {
                          return Parser::T_IMAGE1DARRAY | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
            }
            else if (s[5] == '2') {
              if (s[6] == 'D') {
                if (s[7] == 'A') {
                  if (s[8] == 'r') {
                    if (s[9] == 'r') {
                      if (s[10] == 'a') {
                        if (s[11] == 'y') {
                          return Parser::T_IMAGE2DARRAY | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          return Parser::T_ISAMPLER2DMS | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          return Parser::T_ISAMPLERCUBE | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          return Parser::T_ITEXTURE2DMS | Lexer::Variant_Vulkan;
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          return Parser::T_ITEXTURECUBE | Lexer::Variant_Vulkan;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'u') {
      if (s[2] == 'b') {
        if (s[3] == 'p') {
          if (s[4] == 'a') {
            if (s[5] == 's') {
              if (s[6] == 's') {
                if (s[7] == 'I') {
                  if (s[8] == 'n') {
                    if (s[9] == 'p') {
                      if (s[10] == 'u') {
                        if (s[11] == 't') {
                          return Parser::T_SUBPASSINPUT | Lexer::Variant_Vulkan;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'R') {
                    if (s[9] == 'e') {
                      if (s[10] == 'c') {
                        if (s[11] == 't') {
                          return Parser::T_UIMAGE2DRECT | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == 'B') {
                if (s[7] == 'u') {
                  if (s[8] == 'f') {
                    if (s[9] == 'f') {
                      if (s[10] == 'e') {
                        if (s[11] == 'r') {
                          return Parser::T_UIMAGEBUFFER | Lexer::Variant_GLSL_460; // 420
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          return Parser::T_USAMPLER2DMS | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          return Parser::T_USAMPLERCUBE | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] =='t') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          return Parser::T_UTEXTURE2DMS | Lexer::Variant_Vulkan;
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          return Parser::T_UTEXTURECUBE | Lexer::Variant_Vulkan;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify13(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '1') {
                if (s[7] == 'D') {
                  if (s[8] == 'A') {
                    if (s[9] == 'r') {
                      if (s[10] == 'r') {
                        if (s[11] == 'a') {
                          if (s[12] == 'y') {
                            return Parser::T_IIMAGE1DARRAY | Lexer::Variant_GLSL_460; // 420
                          }
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'A') {
                    if (s[9] == 'r') {
                      if (s[10] == 'r') {
                        if (s[11] == 'a') {
                          if (s[12] == 'y') {
                            return Parser::T_IIMAGE2DARRAY | Lexer::Variant_GLSL_460; // 420
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'u') {
        if (s[3] == 'b') {
          if (s[4] == 'p') {
            if (s[5] == 'a') {
              if (s[6] == 's') {
                if (s[7] == 's') {
                  if (s[8] == 'I') {
                    if (s[9] == 'n') {
                      if (s[10] == 'p') {
                        if (s[11] == 'u') {
                          if (s[12] == 't') {
                            return Parser::T_ISUBPASSINPUT | Lexer::Variant_Vulkan;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'n') {
    if (s[1] == 'o') {
      if (s[2] == 'p') {
        if (s[3] == 'e') {
          if (s[4] == 'r') {
            if (s[5] == 's') {
              if (s[6] == 'p') {
                if (s[7] == 'e') {
                  if (s[8] == 'c') {
                    if (s[9] == 't') {
                      if (s[10] == 'i') {
                        if (s[11] == 'v') {
                          if (s[12] == 'e') {
                            return Parser::T_NOPERSPECTIVE | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'R') {
                      if (s[10] == 'e') {
                        if (s[11] == 'c') {
                          if (s[12] == 't') {
                            return Parser::T_SAMPLER2DRECT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == 'B') {
                  if (s[8] == 'u') {
                    if (s[9] == 'f') {
                      if (s[10] == 'f') {
                        if (s[11] == 'e') {
                          if (s[12] == 'r') {
                            return Parser::T_SAMPLERBUFFER | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == 'S') {
                  if (s[8] == 'h') {
                    if (s[9] == 'a') {
                      if (s[10] == 'd') {
                        if (s[11] == 'o') {
                          if (s[12] == 'w') {
                            return Parser::T_SAMPLERSHADOW | Lexer::Variant_Vulkan;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'e') {
      if (s[2] == 'x') {
        if (s[3] == 't') {
          if (s[4] == 'u') {
            if (s[5] == 'r') {
              if (s[6] == 'e') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'R') {
                      if (s[10] == 'e') {
                        if (s[11] == 'c') {
                          if (s[12] == 't') {
                            return Parser::T_TEXTURE2DRECT | Lexer::Variant_Vulkan;
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == 'B') {
                  if (s[8] == 'u') {
                    if (s[9] == 'f') {
                      if (s[10] == 'f') {
                        if (s[11] == 'e') {
                          if (s[12] == 'r') {
                            return Parser::T_TEXTUREBUFFER | Lexer::Variant_Vulkan;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '1') {
                if (s[7] == 'D') {
                  if (s[8] == 'A') {
                    if (s[9] == 'r') {
                      if (s[10] == 'r') {
                        if (s[11] == 'a') {
                          if (s[12] == 'y') {
                              return Parser::T_UIMAGE1DARRAY | Lexer::Variant_GLSL_460; // 420
                          }
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'A') {
                      if (s[9] == 'r') {
                        if (s[10] == 'r') {
                          if (s[11] == 'a') {
                            if (s[12] == 'y') {
                              return Parser::T_UIMAGE2DARRAY | Lexer::Variant_GLSL_460; // 420
                            }
                          }
                        }
                      }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'u') {
        if (s[3] == 'b') {
          if (s[4] == 'p') {
            if (s[5] == 'a') {
              if (s[6] == 's') {
                if (s[7] == 's') {
                  if (s[8] == 'I') {
                    if (s[9] == 'n') {
                      if (s[10] == 'p') {
                        if (s[11] == 'u') {
                          if (s[12] == 't') {
                              return Parser::T_USUBPASSINPUT | Lexer::Variant_Vulkan;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify14(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 'm') {
      if (s[2] == 'a') {
        if (s[3] == 'g') {
          if (s[4] == 'e') {
            if (s[5] == '2') {
              if (s[6] == 'D') {
                if (s[7] == 'M') {
                  if (s[8] == 'S') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_IMAGE2DMSARRAY | Lexer::Variant_GLSL_460; // 420
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
            else if (s[5] == 'C') {
              if (s[6] == 'u') {
                if (s[7] == 'b') {
                  if (s[8] == 'e') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_IMAGECUBEARRAY | Lexer::Variant_GLSL_460; // 420
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'R') {
                        if (s[11] == 'e') {
                          if (s[12] == 'c') {
                            if (s[13] == 't') {
                              return Parser::T_ISAMPLER2DRECT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'B') {
                    if (s[9] == 'u') {
                      if (s[10] == 'f') {
                        if (s[11] == 'f') {
                          if (s[12] == 'e') {
                            if (s[13] == 'r') {
                              return Parser::T_ISAMPLERBUFFER | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'R') {
                        if (s[11] == 'e') {
                          if (s[12] == 'c') {
                            if (s[13] == 't') {
                              return Parser::T_ITEXTURE2DRECT | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'B') {
                    if (s[9] == 'u') {
                      if (s[10] == 'f') {
                        if (s[11] == 'f') {
                          if (s[12] == 'e') {
                            if (s[13] == 'r') {
                              return Parser::T_ITEXTUREBUFFER | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_SAMPLER1DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_SAMPLER2DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'u') {
      if (s[2] == 'b') {
        if (s[3] == 'p') {
          if (s[4] == 'a') {
            if (s[5] == 's') {
              if (s[6] == 's') {
                if (s[7] == 'I') {
                  if (s[8] == 'n') {
                    if (s[9] == 'p') {
                      if (s[10] == 'u') {
                        if (s[11] == 't') {
                          if (s[12] == 'M') {
                            if (s[13] == 'S') {
                              return Parser::T_SUBPASSINPUTMS | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'e') {
      if (s[2] == 'x') {
        if (s[3] == 't') {
          if (s[4] == 'u') {
            if (s[5] == 'r') {
              if (s[6] == 'e') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_TEXTURE1DARRAY | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              return Parser::T_TEXTURE2DARRAY | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'R') {
                        if (s[11] == 'e') {
                          if (s[12] == 'c') {
                            if (s[13] == 't') {
                              return Parser::T_USAMPLER2DRECT | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'B') {
                    if (s[9] == 'u') {
                      if (s[10] == 'f') {
                        if (s[11] == 'f') {
                          if (s[12] == 'e') {
                            if (s[13] == 'r') {
                              return Parser::T_USAMPLERBUFFER | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'R') {
                        if (s[11] == 'e') {
                          if (s[12] == 'c') {
                            if (s[13] == 't') {
                                return Parser::T_UTEXTURE2DRECT | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'B') {
                    if (s[9] == 'u') {
                      if (s[10] == 'f') {
                        if (s[11] == 'f') {
                          if (s[12] == 'e') {
                            if (s[13] == 'r') {
                              return Parser::T_UTEXTUREBUFFER | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify15(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'M') {
                    if (s[9] == 'S') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_IIMAGE2DMSARRAY | Lexer::Variant_GLSL_460; // 420
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == 'C') {
                if (s[7] == 'u') {
                  if (s[8] == 'b') {
                    if (s[9] == 'e') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_IIMAGECUBEARRAY | Lexer::Variant_GLSL_460; // 420
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_ISAMPLER1DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_ISAMPLER2DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_ITEXTURE1DARRAY | Lexer::Variant_Vulkan;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                  return Parser::T_ITEXTURE2DARRAY | Lexer::Variant_Vulkan;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    if (s[9] == 'S') {
                      if (s[10] == 'h') {
                        if (s[11] == 'a') {
                          if (s[12] == 'd') {
                            if (s[13] == 'o') {
                              if (s[14] == 'w') {
                                return Parser::T_SAMPLER1DSHADOW | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'S') {
                      if (s[10] == 'h') {
                        if (s[11] == 'a') {
                          if (s[12] == 'd') {
                            if (s[13] == 'o') {
                              if (s[14] == 'w') {
                                return Parser::T_SAMPLER2DSHADOW | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 'u') {
      if (s[2] == 'b') {
        if (s[3] == 'p') {
          if (s[4] == 'a') {
            if (s[5] == 's') {
              if (s[6] == 's') {
                if (s[7] == 'I') {
                  if (s[8] == 'n') {
                    if (s[9] == 'p') {
                      if (s[10] == 'u') {
                        if (s[11] == 't') {
                          if (s[12] == 'M') {
                            if (s[13] == 'S') {
                              return Parser::T_ISUBPASSINPUTMS | Lexer::Variant_Vulkan;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 'i') {
      if (s[2] == 'm') {
        if (s[3] == 'a') {
          if (s[4] == 'g') {
            if (s[5] == 'e') {
              if (s[6] == '2') {
                if (s[7] == 'D') {
                  if (s[8] == 'M') {
                    if (s[9] == 'S') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_UIMAGE2DMSARRAY | Lexer::Variant_GLSL_460; // 420
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
              else if (s[6] == 'C') {
                if (s[7] == 'u') {
                  if (s[8] == 'b') {
                    if (s[9] == 'e') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_UIMAGECUBEARRAY | Lexer::Variant_GLSL_460; // 420
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_USAMPLER1DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_USAMPLER2DARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      else if (s[2] == 'u') {
        if (s[3] == 'b') {
          if (s[4] == 'p') {
            if (s[5] == 'a') {
              if (s[6] == 's') {
                if (s[7] == 's') {
                  if (s[8] == 'I') {
                    if (s[9] == 'n') {
                      if (s[10] == 'p') {
                        if (s[11] == 'u') {
                          if (s[12] == 't') {
                            if (s[13] == 'M') {
                              if (s[14] == 'S') {
                                return Parser::T_USUBPASSINPUTMS | Lexer::Variant_Vulkan;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '1') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_UTEXTURE1DARRAY | Lexer::Variant_Vulkan;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'A') {
                        if (s[11] == 'r') {
                          if (s[12] == 'r') {
                            if (s[13] == 'a') {
                              if (s[14] == 'y') {
                                return Parser::T_UTEXTURE2DARRAY | Lexer::Variant_Vulkan;
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify16(const char *s) {
  if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'M') {
                      if (s[10] == 'S') {
                        if (s[11] == 'A') {
                          if (s[12] == 'r') {
                            if (s[13] == 'r') {
                              if (s[14] == 'a') {
                                if (s[15] == 'y') {
                                  return Parser::T_SAMPLER2DMSARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        if (s[11] == 'A') {
                          if (s[12] == 'r') {
                            if (s[13] == 'r') {
                              if (s[14] == 'a') {
                                if (s[15] == 'y') {
                                  return Parser::T_SAMPLERCUBEARRAY | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 't') {
    if (s[1] == 'e') {
      if (s[2] == 'x') {
        if (s[3] == 't') {
          if (s[4] == 'u') {
            if (s[5] == 'r') {
              if (s[6] == 'e') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'M') {
                      if (s[10] == 'S') {
                        if (s[11] == 'A') {
                          if (s[12] == 'r') {
                            if (s[13] == 'r') {
                              if (s[14] == 'a') {
                                if (s[15] == 'y') {
                                  return Parser::T_TEXTURE2DMSARRAY | Lexer::Variant_Vulkan;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        if (s[11] == 'A') {
                          if (s[12] == 'r') {
                            if (s[13] == 'r') {
                              if (s[14] == 'a') {
                                if (s[15] == 'y') {
                                    return Parser::T_TEXTURECUBEARRAY | Lexer::Variant_Vulkan;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify17(const char *s) {
  if (s[0] == 'i') {
    if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_ISAMPLER2DMSARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_ISAMPLERCUBEARRAY | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_ITEXTURE2DMSARRAY | Lexer::Variant_Vulkan;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                      return Parser::T_ITEXTURECUBEARRAY | Lexer::Variant_Vulkan;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        if (s[11] == 'S') {
                          if (s[12] == 'h') {
                            if (s[13] == 'a') {
                              if (s[14] == 'd') {
                                if (s[15] == 'o') {
                                  if (s[16] == 'w') {
                                    return Parser::T_SAMPLERCUBESHADOW | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  else if (s[0] == 'u') {
    if (s[1] == 's') {
      if (s[2] == 'a') {
        if (s[3] == 'm') {
          if (s[4] == 'p') {
            if (s[5] == 'l') {
              if (s[6] == 'e') {
                if (s[7] == 'r') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_USAMPLER2DMSARRAY | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_USAMPLERCUBEARRAY | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    else if (s[1] == 't') {
      if (s[2] == 'e') {
        if (s[3] == 'x') {
          if (s[4] == 't') {
            if (s[5] == 'u') {
              if (s[6] == 'r') {
                if (s[7] == 'e') {
                  if (s[8] == '2') {
                    if (s[9] == 'D') {
                      if (s[10] == 'M') {
                        if (s[11] == 'S') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_UTEXTURE2DMSARRAY | Lexer::Variant_Vulkan;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                  else if (s[8] == 'C') {
                    if (s[9] == 'u') {
                      if (s[10] == 'b') {
                        if (s[11] == 'e') {
                          if (s[12] == 'A') {
                            if (s[13] == 'r') {
                              if (s[14] == 'r') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'y') {
                                    return Parser::T_UTEXTURECUBEARRAY | Lexer::Variant_Vulkan;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify19(const char *s) {
  if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'R') {
                      if (s[10] == 'e') {
                        if (s[11] == 'c') {
                          if (s[12] == 't') {
                            if (s[13] == 'S') {
                              if (s[14] == 'h') {
                                if (s[15] == 'a') {
                                  if (s[16] == 'd') {
                                    if (s[17] == 'o') {
                                      if (s[18] == 'w') {
                                        return Parser::T_SAMPLER2DRECTSHADOW | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify20(const char *s) {
  if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == '1') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              if (s[14] == 'S') {
                                if (s[15] == 'h') {
                                  if (s[16] == 'a') {
                                    if (s[17] == 'd') {
                                      if (s[18] == 'o') {
                                        if (s[19] == 'w') {
                                          return Parser::T_SAMPLER1DARRAYSHADOW | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
                else if (s[7] == '2') {
                  if (s[8] == 'D') {
                    if (s[9] == 'A') {
                      if (s[10] == 'r') {
                        if (s[11] == 'r') {
                          if (s[12] == 'a') {
                            if (s[13] == 'y') {
                              if (s[14] == 'S') {
                                if (s[15] == 'h') {
                                  if (s[16] == 'a') {
                                    if (s[17] == 'd') {
                                      if (s[18] == 'o') {
                                        if (s[19] == 'w') {
                                          return Parser::T_SAMPLER2DARRAYSHADOW | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

static inline int classify22(const char *s) {
  if (s[0] == 's') {
    if (s[1] == 'a') {
      if (s[2] == 'm') {
        if (s[3] == 'p') {
          if (s[4] == 'l') {
            if (s[5] == 'e') {
              if (s[6] == 'r') {
                if (s[7] == 'C') {
                  if (s[8] == 'u') {
                    if (s[9] == 'b') {
                      if (s[10] == 'e') {
                        if (s[11] == 'A') {
                          if (s[12] == 'r') {
                            if (s[13] == 'r') {
                              if (s[14] == 'a') {
                                if (s[15] == 'y') {
                                  if (s[16] == 'S') {
                                    if (s[17] == 'h') {
                                      if (s[18] == 'a') {
                                        if (s[19] == 'd') {
                                          if (s[20] == 'o') {
                                            if (s[21] == 'w') {
                                              return Parser::T_SAMPLERCUBEARRAYSHADOW | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460;
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return Parser::T_IDENTIFIER;
}

int Lexer::classify(const char *s, int n) {
  switch (n) {
    case 2: return classify2(s);
    case 3: return classify3(s);
    case 4: return classify4(s);
    case 5: return classify5(s);
    case 6: return classify6(s);
    case 7: return classify7(s);
    case 8: return classify8(s);
    case 9: return classify9(s);
    case 10: return classify10(s);
    case 11: return classify11(s);
    case 12: return classify12(s);
    case 13: return classify13(s);
    case 14: return classify14(s);
    case 15: return classify15(s);
    case 16: return classify16(s);
    case 17: return classify17(s);
    case 19: return classify19(s);
    case 20: return classify20(s);
    case 22: return classify22(s);
    default: return Parser::T_IDENTIFIER;
  } // switch
}

QStringList Lexer::keywords(int variant) {
  QStringList list;
  list += QLatin1String("do");
  list += QLatin1String("if");
  list += QLatin1String("in");
  list += QLatin1String("for");
  list += QLatin1String("int");
  list += QLatin1String("out");
  list += QLatin1String("bool");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("case");
  list += QLatin1String("else");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("flat");
  if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("lowp");
  list += QLatin1String("mat2");
  list += QLatin1String("mat3");
  list += QLatin1String("mat4");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("uint");
  list += QLatin1String("vec2");
  list += QLatin1String("vec3");
  list += QLatin1String("vec4");
  list += QLatin1String("void");
  list += QLatin1String("true");
  list += QLatin1String("break");
  list += QLatin1String("bvec2");
  list += QLatin1String("bvec3");
  list += QLatin1String("bvec4");
  list += QLatin1String("const");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat2");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat3");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat4");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dvec2");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dvec3");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dvec4");
  list += QLatin1String("float");
  if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("highp");
  list += QLatin1String("inout");
  list += QLatin1String("ivec2");
  list += QLatin1String("ivec3");
  list += QLatin1String("ivec4");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("patch");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("uvec2");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("uvec3");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("uvec4");
  list += QLatin1String("while");
  list += QLatin1String("false");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("double");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("layout");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat2x2");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat2x3");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat2x4");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat3x2");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat3x3");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat3x4");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat4x2");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat4x3");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mat4x4");
  list += QLatin1String("return");
  if (variant & (Lexer::Variant_Reserved))
    list += QLatin1String("sample");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("smooth");
  list += QLatin1String("struct");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("switch");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("default");
  if (variant & (Lexer::Variant_FragmentShader))
    list += QLatin1String("discard");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat2x2");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat2x3");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat2x4");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat3x2");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat3x3");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat3x4");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat4x2");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat4x3");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("dmat4x4");
  if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("mediump");
  list += QLatin1String("uniform");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("buffer");
  list += QLatin1String("varying");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("centroid");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("coherent");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("precise");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("readonly");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("restrict");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("shared");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("volatile");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("writeonly");
  list += QLatin1String("continue");
  if (variant & (Lexer::Variant_VertexShader))
    list += QLatin1String("attribute");
  list += QLatin1String("invariant");
  if (variant & (Lexer::Variant_GLSL_ES_100 | Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("precision");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler1D");
  list += QLatin1String("sampler2D");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler3D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler1D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler2D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler3D");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("subroutine");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler1D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler2D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler3D");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler2DMS");
  list += QLatin1String("samplerCube");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler2DMS");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isamplerCube");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler2DMS");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usamplerCube");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("noperspective");
  list += QLatin1String("sampler2DRect");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("samplerBuffer");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler2DRect");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isamplerBuffer");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler1DArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler2DArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler2DRect");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usamplerBuffer");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler1DArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler2DArray");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler1DShadow");
  if (variant & (Lexer::Variant_GLSL_120 | Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler2DShadow");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler1DArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler2DArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler2DMSArray");
  if (variant & (Lexer::Variant_GLSL_400))
    list += QLatin1String("samplerCubeArray");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("isampler2DMSArray");
  if (variant & (Lexer::Variant_GLSL_400))
    list += QLatin1String("isamplerCubeArray");
  if (variant & (Lexer::Variant_GLSL_400))
    list += QLatin1String("samplerCubeShadow");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usampler2DMSarray");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("usamplerCubeArray");
  list += QLatin1String("sampler2DRectShadow");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler1DArrayShadow");
  if (variant & (Lexer::Variant_GLSL_150 | Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("sampler2DArrayShadow");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
    list += QLatin1String("samplerCubeArrayShadow");
  if (variant & (Lexer::Variant_GLSL_400 | Lexer::Variant_GLSL_460))
      list += QLatin1String("atomic_uint");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage1D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage1DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage2D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage2DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage2DMS");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage2DMSArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage2DRect");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimage3D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimageBuffer");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimageCube");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("iimageCubeArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image1D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image1DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image2D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image2DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image2DMS");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image2DMSArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image2DRect");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("image3D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("imageBuffer");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("imageCube");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("imageCubeArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage1D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage1DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage2D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage2DArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage2DMS");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage2DMSArray");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage2DRect");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimage3D");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimageBuffer");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimageCube");
  if (variant & (Lexer::Variant_GLSL_460))
      list += QLatin1String("uimageCubeArray");
  // Vulkan additions
  if (variant & (Lexer::Variant_Vulkan)) {
      list += QLatin1String("isubpassInput");
      list += QLatin1String("isubpassInputMS");
      list += QLatin1String("itexture1D");
      list += QLatin1String("itexture1DArray");
      list += QLatin1String("itexture2D");
      list += QLatin1String("itexture2DArray");
      list += QLatin1String("itexture2DMS");
      list += QLatin1String("itexture2DMSArray");
      list += QLatin1String("itexture2DRect");
      list += QLatin1String("itexture3D");
      list += QLatin1String("itextureBuffer");
      list += QLatin1String("itextureCube");
      list += QLatin1String("itextureCubeArray");
      list += QLatin1String("sampler");
      list += QLatin1String("samplerShadow");
      list += QLatin1String("subpassInput");
      list += QLatin1String("subpassInputMS");
      list += QLatin1String("texture1D");
      list += QLatin1String("texture1DArray");
      list += QLatin1String("texture2D");
      list += QLatin1String("texture2DArray");
      list += QLatin1String("texture2DMS");
      list += QLatin1String("texture2DMSArray");
      list += QLatin1String("texture2DRect");
      list += QLatin1String("texture3D");
      list += QLatin1String("textureBuffer");
      list += QLatin1String("textureCube");
      list += QLatin1String("textureCubeArray");
      list += QLatin1String("usubpassInput");
      list += QLatin1String("usubpassInputMS");
      list += QLatin1String("utexture1D");
      list += QLatin1String("utexture1DArray");
      list += QLatin1String("utexture2D");
      list += QLatin1String("utexture2DArray");
      list += QLatin1String("utexture2DMS");
      list += QLatin1String("utexture2DMSArray");
      list += QLatin1String("utexture2DRect");
      list += QLatin1String("utexture3D");
      list += QLatin1String("utextureBuffer");
      list += QLatin1String("utextureCube");
      list += QLatin1String("utextureCubeArray");
  }
  return list;
}

