1use glsl_lang_pp::types;
2
3use glsl_lang_types::ast::NodeSpan;
4use lang_util::position::LexerPosition;
5
6use crate::{ParseContext, Token};
7
8pub fn lang_token(
9 ctx: &ParseContext,
10 text: &str,
11 pos: NodeSpan,
12 token_kind: types::Token,
13) -> Result<(LexerPosition, Token, LexerPosition), (types::Token, types::token::ErrorKind)> {
14 Ok((
15 pos.start(),
16 match token_kind {
17 types::Token::IDENT(ident) => {
18 if ctx.is_type_name(&ident) {
19 Token::TypeName(ident)
20 } else {
21 Token::Identifier(ident)
23 }
24 }
25 types::Token::TYPE_NAME(type_name) => match type_name {
26 types::TypeName::VOID => Token::Void,
27 types::TypeName::INT => Token::Int,
28 types::TypeName::BOOL => Token::Bool,
29 types::TypeName::FLOAT => Token::Float,
30 types::TypeName::DOUBLE => Token::Double,
31 types::TypeName::VEC2 => Token::Vec2,
32 types::TypeName::VEC3 => Token::Vec3,
33 types::TypeName::VEC4 => Token::Vec4,
34 types::TypeName::IVEC2 => Token::IVec2,
35 types::TypeName::IVEC3 => Token::IVec3,
36 types::TypeName::IVEC4 => Token::IVec4,
37 types::TypeName::BVEC2 => Token::BVec2,
38 types::TypeName::BVEC3 => Token::BVec3,
39 types::TypeName::BVEC4 => Token::BVec4,
40 types::TypeName::UINT => Token::UInt,
41 types::TypeName::ATOMIC_UINT => Token::AtomicUInt,
42 types::TypeName::UVEC2 => Token::UVec2,
43 types::TypeName::UVEC3 => Token::UVec3,
44 types::TypeName::UVEC4 => Token::UVec4,
45 types::TypeName::DVEC2 => Token::DVec2,
46 types::TypeName::DVEC3 => Token::DVec3,
47 types::TypeName::DVEC4 => Token::DVec4,
48 types::TypeName::MAT2 => Token::Mat2,
49 types::TypeName::MAT3 => Token::Mat3,
50 types::TypeName::MAT4 => Token::Mat4,
51 types::TypeName::MAT2X2 => Token::Mat2x2,
52 types::TypeName::MAT2X3 => Token::Mat2x3,
53 types::TypeName::MAT2X4 => Token::Mat2x4,
54 types::TypeName::MAT3X2 => Token::Mat3x2,
55 types::TypeName::MAT3X3 => Token::Mat3x3,
56 types::TypeName::MAT3X4 => Token::Mat3x4,
57 types::TypeName::MAT4X2 => Token::Mat4x2,
58 types::TypeName::MAT4X3 => Token::Mat4x3,
59 types::TypeName::MAT4X4 => Token::Mat4x4,
60 types::TypeName::DMAT2 => Token::DMat2,
61 types::TypeName::DMAT3 => Token::DMat3,
62 types::TypeName::DMAT4 => Token::DMat4,
63 types::TypeName::DMAT2X2 => Token::DMat2x2,
64 types::TypeName::DMAT2X3 => Token::DMat2x3,
65 types::TypeName::DMAT2X4 => Token::DMat2x4,
66 types::TypeName::DMAT3X2 => Token::DMat3x2,
67 types::TypeName::DMAT3X3 => Token::DMat3x3,
68 types::TypeName::DMAT3X4 => Token::DMat3x4,
69 types::TypeName::DMAT4X2 => Token::DMat4x2,
70 types::TypeName::DMAT4X3 => Token::DMat4x3,
71 types::TypeName::DMAT4X4 => Token::DMat4x4,
72 types::TypeName::SAMPLER1D => Token::Sampler1D,
73 types::TypeName::SAMPLER1DSHADOW => Token::Sampler1DShadow,
74 types::TypeName::SAMPLER1DARRAY => Token::Sampler1DArray,
75 types::TypeName::SAMPLER1DARRAYSHADOW => Token::Sampler1DArrayShadow,
76 types::TypeName::ISAMPLER1D => Token::ISampler1D,
77 types::TypeName::ISAMPLER1DARRAY => Token::ISampler1DArray,
78 types::TypeName::USAMPLER1D => Token::USampler1D,
79 types::TypeName::USAMPLER1DARRAY => Token::USampler1DArray,
80 types::TypeName::SAMPLER2D => Token::Sampler2D,
81 types::TypeName::SAMPLER2DSHADOW => Token::Sampler2DShadow,
82 types::TypeName::SAMPLER2DARRAY => Token::Sampler2DArray,
83 types::TypeName::SAMPLER2DARRAYSHADOW => Token::Sampler2DArrayShadow,
84 types::TypeName::ISAMPLER2D => Token::ISampler2D,
85 types::TypeName::ISAMPLER2DARRAY => Token::ISampler2DArray,
86 types::TypeName::USAMPLER2D => Token::USampler2D,
87 types::TypeName::USAMPLER2DARRAY => Token::USampler2DArray,
88 types::TypeName::SAMPLER2DRECT => Token::Sampler2DRect,
89 types::TypeName::SAMPLER2DRECTSHADOW => Token::Sampler2DRectShadow,
90 types::TypeName::ISAMPLER2DRECT => Token::ISampler2DRect,
91 types::TypeName::USAMPLER2DRECT => Token::USampler2DRect,
92 types::TypeName::SAMPLER2DMS => Token::Sampler2DMs,
93 types::TypeName::ISAMPLER2DMS => Token::ISampler2DMs,
94 types::TypeName::USAMPLER2DMS => Token::USampler2DMs,
95 types::TypeName::SAMPLER2DMSARRAY => Token::Sampler2DMsArray,
96 types::TypeName::ISAMPLER2DMSARRAY => Token::ISampler2DMsArray,
97 types::TypeName::USAMPLER2DMSARRAY => Token::USampler2DMsArray,
98 types::TypeName::SAMPLER3D => Token::Sampler3D,
99 types::TypeName::ISAMPLER3D => Token::ISampler3D,
100 types::TypeName::USAMPLER3D => Token::USampler3D,
101 types::TypeName::SAMPLERCUBE => Token::SamplerCube,
102 types::TypeName::SAMPLERCUBESHADOW => Token::SamplerCubeShadow,
103 types::TypeName::ISAMPLERCUBE => Token::ISamplerCube,
104 types::TypeName::USAMPLERCUBE => Token::USamplerCube,
105 types::TypeName::SAMPLERCUBEARRAY => Token::SamplerCubeArray,
106 types::TypeName::SAMPLERCUBEARRAYSHADOW => Token::SamplerCubeArrayShadow,
107 types::TypeName::ISAMPLERCUBEARRAY => Token::ISamplerCubeArray,
108 types::TypeName::USAMPLERCUBEARRAY => Token::USamplerCubeArray,
109 types::TypeName::SAMPLERBUFFER => Token::SamplerBuffer,
110 types::TypeName::ISAMPLERBUFFER => Token::ISamplerBuffer,
111 types::TypeName::USAMPLERBUFFER => Token::USamplerBuffer,
112 types::TypeName::IMAGE1D => Token::Image1D,
113 types::TypeName::IIMAGE1D => Token::IImage1D,
114 types::TypeName::UIMAGE1D => Token::UImage1D,
115 types::TypeName::IMAGE1DARRAY => Token::Image1DArray,
116 types::TypeName::IIMAGE1DARRAY => Token::IImage1DArray,
117 types::TypeName::UIMAGE1DARRAY => Token::UImage1DArray,
118 types::TypeName::IMAGE2D => Token::Image2D,
119 types::TypeName::IIMAGE2D => Token::IImage2D,
120 types::TypeName::UIMAGE2D => Token::UImage2D,
121 types::TypeName::IMAGE2DARRAY => Token::Image2DArray,
122 types::TypeName::IIMAGE2DARRAY => Token::IImage2DArray,
123 types::TypeName::UIMAGE2DARRAY => Token::UImage2DArray,
124 types::TypeName::IMAGE2DRECT => Token::Image2DRect,
125 types::TypeName::IIMAGE2DRECT => Token::IImage2DRect,
126 types::TypeName::UIMAGE2DRECT => Token::UImage2DRect,
127 types::TypeName::IMAGE2DMS => Token::Image2DMs,
128 types::TypeName::IIMAGE2DMS => Token::IImage2DMs,
129 types::TypeName::UIMAGE2DMS => Token::UImage2DMs,
130 types::TypeName::IMAGE2DMSARRAY => Token::Image2DMsArray,
131 types::TypeName::IIMAGE2DMSARRAY => Token::IImage2DMsArray,
132 types::TypeName::UIMAGE2DMSARRAY => Token::UImage2DMsArray,
133 types::TypeName::IMAGE3D => Token::Image3D,
134 types::TypeName::IIMAGE3D => Token::IImage3D,
135 types::TypeName::UIMAGE3D => Token::UImage3D,
136 types::TypeName::IMAGECUBE => Token::ImageCube,
137 types::TypeName::IIMAGECUBE => Token::IImageCube,
138 types::TypeName::UIMAGECUBE => Token::UImageCube,
139 types::TypeName::IMAGECUBEARRAY => Token::ImageCubeArray,
140 types::TypeName::IIMAGECUBEARRAY => Token::IImageCubeArray,
141 types::TypeName::UIMAGECUBEARRAY => Token::UImageCubeArray,
142 types::TypeName::IMAGEBUFFER => Token::ImageBuffer,
143 types::TypeName::IIMAGEBUFFER => Token::IImageBuffer,
144 types::TypeName::UIMAGEBUFFER => Token::UImageBuffer,
145 types::TypeName::TEXTURE1D => Token::Texture1D,
146 types::TypeName::TEXTURE1DARRAY => Token::Texture1DArray,
147 types::TypeName::ITEXTURE1D => Token::ITexture1D,
148 types::TypeName::ITEXTURE1DARRAY => Token::ITexture1DArray,
149 types::TypeName::UTEXTURE1D => Token::UTexture1D,
150 types::TypeName::UTEXTURE1DARRAY => Token::UTexture1DArray,
151 types::TypeName::TEXTURE2D => Token::Texture2D,
152 types::TypeName::TEXTURE2DARRAY => Token::Texture2DArray,
153 types::TypeName::ITEXTURE2D => Token::ITexture2D,
154 types::TypeName::ITEXTURE2DARRAY => Token::ITexture2DArray,
155 types::TypeName::UTEXTURE2D => Token::UTexture2D,
156 types::TypeName::UTEXTURE2DARRAY => Token::UTexture2DArray,
157 types::TypeName::TEXTURE2DRECT => Token::Texture2DRect,
158 types::TypeName::ITEXTURE2DRECT => Token::ITexture2DRect,
159 types::TypeName::UTEXTURE2DRECT => Token::UTexture2DRect,
160 types::TypeName::TEXTURE2DMS => Token::Texture2DMs,
161 types::TypeName::ITEXTURE2DMS => Token::ITexture2DMs,
162 types::TypeName::UTEXTURE2DMS => Token::UTexture2DMs,
163 types::TypeName::TEXTURE2DMSARRAY => Token::Texture2DMsArray,
164 types::TypeName::ITEXTURE2DMSARRAY => Token::ITexture2DMsArray,
165 types::TypeName::UTEXTURE2DMSARRAY => Token::UTexture2DMsArray,
166 types::TypeName::TEXTURE3D => Token::Texture3D,
167 types::TypeName::ITEXTURE3D => Token::ITexture3D,
168 types::TypeName::UTEXTURE3D => Token::UTexture3D,
169 types::TypeName::TEXTURECUBE => Token::TextureCube,
170 types::TypeName::ITEXTURECUBE => Token::ITextureCube,
171 types::TypeName::UTEXTURECUBE => Token::UTextureCube,
172 types::TypeName::TEXTURECUBEARRAY => Token::TextureCubeArray,
173 types::TypeName::ITEXTURECUBEARRAY => Token::ITextureCubeArray,
174 types::TypeName::UTEXTURECUBEARRAY => Token::UTextureCubeArray,
175 types::TypeName::TEXTUREBUFFER => Token::TextureBuffer,
176 types::TypeName::ITEXTUREBUFFER => Token::ITextureBuffer,
177 types::TypeName::UTEXTUREBUFFER => Token::UTextureBuffer,
178 types::TypeName::SAMPLER => Token::Sampler,
179 types::TypeName::SAMPLERSHADOW => Token::SamplerShadow,
180 types::TypeName::SUBPASSINPUT => Token::SubpassInput,
181 types::TypeName::ISUBPASSINPUT => Token::ISubpassInput,
182 types::TypeName::USUBPASSINPUT => Token::USubpassInput,
183 types::TypeName::SUBPASSINPUTMS => Token::SubpassInputMs,
184 types::TypeName::ISUBPASSINPUTMS => Token::ISubpassInputMs,
185 types::TypeName::USUBPASSINPUTMS => Token::USubpassInputMs,
186 other => Token::TypeName(other.to_string().into()),
187 },
188 types::Token::FLOAT_CONST(val) => Token::FloatConstant(val),
189 types::Token::INT_CONST(val) => Token::IntConstant(val),
190 types::Token::UINT_CONST(val) => Token::UIntConstant(val),
191 types::Token::BOOL_CONST(val) => Token::BoolConstant(val),
192 types::Token::DOUBLE_CONST(val) => Token::DoubleConstant(val),
193 types::Token::LEFT_OP => Token::LeftOp,
194 types::Token::RIGHT_OP => Token::RightOp,
195 types::Token::INC_OP => Token::IncOp,
196 types::Token::DEC_OP => Token::DecOp,
197 types::Token::LE_OP => Token::LeOp,
198 types::Token::GE_OP => Token::GeOp,
199 types::Token::EQ_OP => Token::EqOp,
200 types::Token::NE_OP => Token::NeOp,
201 types::Token::AND_OP => Token::AndOp,
202 types::Token::OR_OP => Token::OrOp,
203 types::Token::XOR_OP => Token::XorOp,
204 types::Token::MUL_ASSIGN => Token::MulAssign,
205 types::Token::DIV_ASSIGN => Token::DivAssign,
206 types::Token::ADD_ASSIGN => Token::AddAssign,
207 types::Token::MOD_ASSIGN => Token::ModAssign,
208 types::Token::LEFT_ASSIGN => Token::LeftAssign,
209 types::Token::RIGHT_ASSIGN => Token::RightAssign,
210 types::Token::AND_ASSIGN => Token::AndAssign,
211 types::Token::XOR_ASSIGN => Token::XorAssign,
212 types::Token::OR_ASSIGN => Token::OrAssign,
213 types::Token::SUB_ASSIGN => Token::SubAssign,
214 types::Token::LPAREN => Token::LeftParen,
215 types::Token::RPAREN => Token::RightParen,
216 types::Token::LBRACKET => Token::LeftBracket,
217 types::Token::RBRACKET => Token::RightBracket,
218 types::Token::LBRACE => Token::LeftBrace,
219 types::Token::RBRACE => Token::RightBrace,
220 types::Token::PERIOD => Token::Dot,
221 types::Token::COMMA => Token::Comma,
222 types::Token::COLON => Token::Colon,
223 types::Token::EQUAL => Token::Equal,
224 types::Token::SEMICOLON => Token::Semicolon,
225 types::Token::BANG => Token::Bang,
226 types::Token::DASH => Token::Dash,
227 types::Token::TILDE => Token::Tilde,
228 types::Token::PLUS => Token::Plus,
229 types::Token::ASTERISK => Token::Star,
230 types::Token::SLASH => Token::Slash,
231 types::Token::PERCENT => Token::Percent,
232 types::Token::LANGLE => Token::LeftAngle,
233 types::Token::RANGLE => Token::RightAngle,
234 types::Token::BAR => Token::VerticalBar,
235 types::Token::CARET => Token::Caret,
236 types::Token::AMPERSAND => Token::Ampersand,
237 types::Token::QUESTION => Token::Question,
238 types::Token::HASH => {
239 return Err((token_kind, types::token::ErrorKind::InvalidToken));
240 }
241 types::Token::CONST => Token::Const,
242 types::Token::UNIFORM => Token::Uniform,
243 types::Token::BUFFER => Token::Buffer,
244 types::Token::SHARED => Token::Shared,
245 types::Token::COHERENT => Token::Coherent,
246 types::Token::VOLATILE => Token::Volatile,
247 types::Token::RESTRICT => Token::Restrict,
248 types::Token::READONLY => Token::ReadOnly,
249 types::Token::WRITEONLY => Token::WriteOnly,
250 types::Token::LAYOUT => Token::Layout,
251 types::Token::CENTROID => Token::Centroid,
252 types::Token::FLAT => Token::Flat,
253 types::Token::SMOOTH => Token::Smooth,
254 types::Token::NOPERSPECTIVE => Token::NoPerspective,
255 types::Token::PATCH => Token::Patch,
256 types::Token::SAMPLE => Token::Sample,
257 types::Token::INVARIANT => Token::Invariant,
258 types::Token::PRECISE => Token::Precise,
259 types::Token::BREAK => Token::Break,
260 types::Token::CONTINUE => Token::Continue,
261 types::Token::DO => Token::Do,
262 types::Token::FOR => Token::For,
263 types::Token::WHILE => Token::While,
264 types::Token::SWITCH => Token::Switch,
265 types::Token::CASE => Token::Case,
266 types::Token::DEFAULT => Token::Default,
267 types::Token::IF => Token::If,
268 types::Token::ELSE => Token::Else,
269 types::Token::SUBROUTINE => Token::Subroutine,
270 types::Token::IN => Token::In,
271 types::Token::OUT => Token::Out,
272 types::Token::INOUT => Token::InOut,
273 types::Token::DISCARD => Token::Discard,
274 types::Token::RETURN => Token::Return,
275 types::Token::LOWP => Token::LowPrecision,
276 types::Token::MEDIUMP => Token::MediumPrecision,
277 types::Token::HIGHP => Token::HighPrecision,
278 types::Token::PRECISION => Token::Precision,
279 types::Token::STRUCT => Token::Struct,
280 types::Token::ATTRIBUTE => Token::Attribute,
281 types::Token::VARYING => Token::Varying,
282 types::Token::COMMON
283 | types::Token::PARTITION
284 | types::Token::ACTIVE
285 | types::Token::ASM
286 | types::Token::CLASS
287 | types::Token::UNION
288 | types::Token::ENUM
289 | types::Token::TYPEDEF
290 | types::Token::TEMPLATE
291 | types::Token::THIS
292 | types::Token::RESOURCE
293 | types::Token::GOTO
294 | types::Token::INLINE
295 | types::Token::NOINLINE
296 | types::Token::PUBLIC
297 | types::Token::STATIC
298 | types::Token::EXTERN
299 | types::Token::EXTERNAL
300 | types::Token::INTERFACE
301 | types::Token::LONG
302 | types::Token::SHORT
303 | types::Token::HALF
304 | types::Token::FIXED
305 | types::Token::UNSIGNED
306 | types::Token::SUPERP
307 | types::Token::INPUT
308 | types::Token::OUTPUT
309 | types::Token::FILTER
310 | types::Token::SIZEOF
311 | types::Token::CAST
312 | types::Token::NAMESPACE
313 | types::Token::USING => {
314 return Err((token_kind, types::token::ErrorKind::InvalidToken));
315 }
316 types::Token::WS => Token::Whitespace,
317 types::Token::COMMENT => {
318 if text.starts_with("//") {
319 Token::SingleLineComment
320 } else {
321 Token::MultiLineComment
322 }
323 }
324 types::Token::ERROR(kind) => {
325 return Err((token_kind, kind));
326 }
327 },
328 pos.end(),
329 ))
330}