diff --git a/data/syntax/glsl.xml b/syntax/glsl.xml similarity index 99% rename from data/syntax/glsl.xml rename to syntax/glsl.xml index 09d171a..4550273 100644 --- a/data/syntax/glsl.xml +++ b/syntax/glsl.xml @@ -1,1217 +1,1217 @@ - + break continue do for while if else true false discard return struct subroutine layout uniform buffer invariant float int void bool mat2 mat3 mat4 vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 sampler1D sampler2D sampler3D samplerCube sampler2DRect sampler1DArray sampler2DArray samplerCubeArray samplerBuffer sampler2DMS sampler2DMSArray sampler1DShadow sampler2DShadow samplerCubeShadow sampler2DRectShadow sampler1DArrayShadow sampler2DArrayShadow samplerCubeArrayShadow isampler1D isampler2D isampler3D isamplerCube isampler2DRect isampler1DArray isampler2DArray isamplerCubeArray isamplerBuffer isampler2DMS isampler2DMSArray isampler1DShadow isampler2DShadow isamplerCubeShadow isampler2DRectShadow isampler1DArrayShadow isampler2DArrayShadow isamplerCubeArrayShadow usampler1D usampler2D usampler3D usamplerCube usampler2DRect usampler1DArray usampler2DArray usamplerCubeArray usamplerBuffer usampler2DMS usampler2DMSArray usampler1DShadow usampler2DShadow usamplerCubeShadow usampler2DRectShadow usampler1DArrayShadow usampler2DArrayShadow usamplerCubeArrayShadow atomic_uint attribute const varying in out inout flat noperspective smooth location component binding index offset row_major packed shared std140 std430 xfb_buffer xfb_offset xfb_stride origin_upper_left pixel_center_integer early_fragment_tests points lines lines_adjacency triangles triangles_adjacency line_strip triangle_strip max_vertices invocations stream isolines triangles quads point_mode equal_spacing fractional_even_spacing fractional_odd_spacing cw ccw vertices coherent volatile restrict readonly writeonly FIXME TODO BUG abs acos acosh glActiveShaderProgram glActiveTexture all any asin asinh atan atanh atomicAdd atomicAnd atomicCompSwap atomicCounter atomicCounterDecrement atomicCounterIncrement atomicExchange atomicMax atomicMin atomicOr atomicXor glAttachShader barrier glBeginConditionalRender glBeginQuery glBeginQueryIndexed glBeginTransformFeedback glBindAttribLocation glBindBuffer glBindBufferBase glBindBufferRange glBindBuffersBase glBindBuffersRange glBindFragDataLocation glBindFragDataLocationIndexed glBindFramebuffer glBindImageTexture glBindImageTextures glBindProgramPipeline glBindRenderbuffer glBindSampler glBindSamplers glBindTexture glBindTextures glBindTextureUnit glBindTransformFeedback glBindVertexArray glBindVertexBuffer glBindVertexBuffers bitCount bitfieldExtract bitfieldInsert bitfieldReverse glBlendColor glBlendEquation glBlendEquationi glBlendEquationSeparate glBlendEquationSeparatei glBlendFunc glBlendFunci glBlendFuncSeparate glBlendFuncSeparatei glBlitFramebuffer glBlitNamedFramebuffer glBufferData glBufferStorage glBufferSubData ceil glCheckFramebufferStatus glCheckNamedFramebufferStatus clamp glClampColor glClear glClearBuffer glClearBufferData glClearBufferfi glClearBufferfv glClearBufferiv glClearBufferSubData glClearBufferuiv glClearColor glClearDepth glClearDepthf glClearNamedBufferData glClearNamedBufferSubData glClearNamedFramebufferfi glClearNamedFramebufferfv glClearNamedFramebufferiv glClearNamedFramebufferuiv glClearStencil glClearTexImage glClearTexSubImage glClientWaitSync glClipControl glColorMask glColorMaski glCompileShader glCompressedTexImage1D glCompressedTexImage2D glCompressedTexImage3D glCompressedTexSubImage1D glCompressedTexSubImage2D glCompressedTexSubImage3D glCompressedTextureSubImage1D glCompressedTextureSubImage2D glCompressedTextureSubImage3D glCopyBufferSubData glCopyImageSubData glCopyNamedBufferSubData glCopyTexImage1D glCopyTexImage2D glCopyTexSubImage1D glCopyTexSubImage2D glCopyTexSubImage3D glCopyTextureSubImage1D glCopyTextureSubImage2D glCopyTextureSubImage3D cos cosh glCreateBuffers glCreateFramebuffers glCreateProgram glCreateProgramPipelines glCreateQueries glCreateRenderbuffers glCreateSamplers glCreateShader glCreateShaderProgram glCreateShaderProgramv glCreateTextures glCreateTransformFeedbacks glCreateVertexArrays cross glCullFace glDebugMessageCallback glDebugMessageControl glDebugMessageInsert degrees glDeleteBuffers glDeleteFramebuffers glDeleteProgram glDeleteProgramPipelines glDeleteQueries glDeleteRenderbuffers glDeleteSamplers glDeleteShader glDeleteSync glDeleteTextures glDeleteTransformFeedbacks glDeleteVertexArrays glDepthFunc glDepthMask glDepthRange glDepthRangeArray glDepthRangeArrayv glDepthRangef glDepthRangeIndexed glDetachShader determinant dFdx dFdxCoarse dFdxFine dFdy dFdyCoarse dFdyFine glDisable glDisablei glDisableVertexArrayAttrib glDisableVertexAttribArray glDispatchCompute glDispatchComputeIndirect distance dot glDrawArrays glDrawArraysIndirect glDrawArraysInstanced glDrawArraysInstancedBaseInstance glDrawBuffer glDrawBuffers glDrawElements glDrawElementsBaseVertex glDrawElementsIndirect glDrawElementsInstanced glDrawElementsInstancedBaseInstance glDrawElementsInstancedBaseVertex glDrawElementsInstancedBaseVertexBaseInstance glDrawRangeElements glDrawRangeElementsBaseVertex glDrawTransformFeedback glDrawTransformFeedbackInstanced glDrawTransformFeedbackStream glDrawTransformFeedbackStreamInstanced EmitStreamVertex EmitVertex glEnable glEnablei glEnableVertexArrayAttrib glEnableVertexAttribArray glEndConditionalRender EndPrimitive glEndQuery glEndQueryIndexed EndStreamPrimitive glEndTransformFeedback equal exp exp2 faceforward glFenceSync findLSB findMSB glFinish floatBitsToInt floatBitsToUint floor glFlush glFlushMappedBufferRange glFlushMappedNamedBufferRange fma fract glFramebufferParameteri glFramebufferRenderbuffer glFramebufferTexture glFramebufferTexture1D glFramebufferTexture2D glFramebufferTexture3D glFramebufferTextureLayer frexp glFrontFace fwidth fwidthCoarse fwidthFine glGenBuffers glGenerateMipmap glGenerateTextureMipmap glGenFramebuffers glGenProgramPipelines glGenQueries glGenRenderbuffers glGenSamplers glGenTextures glGenTransformFeedbacks glGenVertexArrays glGet glGetActiveAtomicCounterBufferiv glGetActiveAttrib glGetActiveSubroutineName glGetActiveSubroutineUniform glGetActiveSubroutineUniformiv glGetActiveSubroutineUniformName glGetActiveUniform glGetActiveUniformBlock glGetActiveUniformBlockiv glGetActiveUniformBlockName glGetActiveUniformName glGetActiveUniformsiv glGetAttachedShaders glGetAttribLocation glGetBooleani_v glGetBooleanv glGetBufferParameter glGetBufferParameteri64v glGetBufferParameteriv glGetBufferPointerv glGetBufferSubData glGetCompressedTexImage glGetCompressedTextureImage glGetCompressedTextureSubImage glGetDebugMessageLog glGetDoublei_v glGetDoublev glGetError glGetFloati_v glGetFloatv glGetFragDataIndex glGetFragDataLocation glGetFramebufferAttachmentParameter glGetFramebufferAttachmentParameteriv glGetFramebufferParameter glGetFramebufferParameteriv glGetGraphicsResetStatus glGetInteger64i_v glGetInteger64v glGetIntegeri_v glGetIntegerv glGetInternalformat glGetInternalformati64v glGetInternalformativ glGetMultisample glGetMultisamplefv glGetNamedBufferParameteri64v glGetNamedBufferParameteriv glGetNamedBufferPointerv glGetNamedBufferSubData glGetNamedFramebufferAttachmentParameteriv glGetNamedFramebufferParameteriv glGetNamedRenderbufferParameteriv glGetnCompressedTexImage glGetnTexImage glGetnUniformdv glGetnUniformfv glGetnUniformiv glGetnUniformuiv glGetObjectLabel glGetObjectPtrLabel glGetPointerv glGetProgram glGetProgramBinary glGetProgramInfoLog glGetProgramInterface glGetProgramInterfaceiv glGetProgramiv glGetProgramPipeline glGetProgramPipelineInfoLog glGetProgramPipelineiv glGetProgramResource glGetProgramResourceIndex glGetProgramResourceiv glGetProgramResourceLocation glGetProgramResourceLocationIndex glGetProgramResourceName glGetProgramStage glGetProgramStageiv glGetQueryIndexed glGetQueryIndexediv glGetQueryiv glGetQueryObject glGetQueryObjecti64v glGetQueryObjectiv glGetQueryObjectui64v glGetQueryObjectuiv glGetRenderbufferParameter glGetRenderbufferParameteriv glGetSamplerParameter glGetSamplerParameterfv glGetSamplerParameterIiv glGetSamplerParameterIuiv glGetSamplerParameteriv glGetShader glGetShaderInfoLog glGetShaderiv glGetShaderPrecisionFormat glGetShaderSource glGetString glGetStringi glGetSubroutineIndex glGetSubroutineUniformLocation glGetSync glGetSynciv glGetTexImage glGetTexLevelParameter glGetTexLevelParameterfv glGetTexLevelParameteriv glGetTexParameter glGetTexParameterfv glGetTexParameterIiv glGetTexParameterIuiv glGetTexParameteriv glGetTextureImage glGetTextureLevelParameterfv glGetTextureLevelParameteriv glGetTextureParameterfv glGetTextureParameterIiv glGetTextureParameterIuiv glGetTextureParameteriv glGetTextureSubImage glGetTransformFeedback glGetTransformFeedbacki64_v glGetTransformFeedbacki_v glGetTransformFeedbackiv glGetTransformFeedbackVarying glGetUniform glGetUniformBlockIndex glGetUniformdv glGetUniformfv glGetUniformIndices glGetUniformiv glGetUniformLocation glGetUniformSubroutine glGetUniformSubroutineuiv glGetUniformuiv glGetVertexArrayIndexed glGetVertexArrayIndexed64iv glGetVertexArrayIndexediv glGetVertexArrayiv glGetVertexAttrib glGetVertexAttribdv glGetVertexAttribfv glGetVertexAttribIiv glGetVertexAttribIuiv glGetVertexAttribiv glGetVertexAttribLdv glGetVertexAttribPointerv gl_ClipDistance gl_CullDistance gl_FragCoord gl_FragDepth gl_FrontFacing gl_GlobalInvocationID gl_HelperInvocation gl_InstanceID gl_InvocationID gl_Layer gl_LocalInvocationID gl_LocalInvocationIndex gl_NumSamples gl_NumWorkGroups gl_PatchVerticesIn gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_VertexID gl_ViewportIndex gl_WorkGroupID gl_WorkGroupSize greaterThan greaterThanEqual groupMemoryBarrier glHint imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageSamples imageSize imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample glInvalidateBufferData glInvalidateBufferSubData glInvalidateFramebuffer glInvalidateNamedFramebufferData glInvalidateNamedFramebufferSubData glInvalidateSubFramebuffer glInvalidateTexImage glInvalidateTexSubImage inverse inversesqrt glIsBuffer glIsEnabled glIsEnabledi glIsFramebuffer isinf isnan glIsProgram glIsProgramPipeline glIsQuery glIsRenderbuffer glIsSampler glIsShader glIsSync glIsTexture glIsTransformFeedback glIsVertexArray ldexp length lessThan lessThanEqual glLineWidth glLinkProgram log log2 glLogicOp glMapBuffer glMapBufferRange glMapNamedBuffer glMapNamedBufferRange matrixCompMult max memoryBarrier glMemoryBarrier memoryBarrierAtomicCounter memoryBarrierBuffer glMemoryBarrierByRegion memoryBarrierImage memoryBarrierShared min glMinSampleShading mix mod modf glMultiDrawArrays glMultiDrawArraysIndirect glMultiDrawElements glMultiDrawElementsBaseVertex glMultiDrawElementsIndirect glNamedBufferData glNamedBufferStorage glNamedBufferSubData glNamedFramebufferDrawBuffer glNamedFramebufferDrawBuffers glNamedFramebufferParameteri glNamedFramebufferReadBuffer glNamedFramebufferRenderbuffer glNamedFramebufferTexture glNamedFramebufferTextureLayer glNamedRenderbufferStorage glNamedRenderbufferStorageMultisample noise noise1 noise2 noise3 noise4 normalize not notEqual glObjectLabel glObjectPtrLabel outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm packUnorm2x16 packUnorm4x8 glPatchParameter glPatchParameterfv glPatchParameteri glPauseTransformFeedback glPixelStore glPixelStoref glPixelStorei glPointParameter glPointParameterf glPointParameterfv glPointParameteri glPointParameteriv glPointSize glPolygonMode glPolygonOffset glPopDebugGroup pow glPrimitiveRestartIndex glProgramBinary glProgramParameter glProgramParameteri glProgramUniform glProgramUniform1f glProgramUniform1fv glProgramUniform1i glProgramUniform1iv glProgramUniform1ui glProgramUniform1uiv glProgramUniform2f glProgramUniform2fv glProgramUniform2i glProgramUniform2iv glProgramUniform2ui glProgramUniform2uiv glProgramUniform3f glProgramUniform3fv glProgramUniform3i glProgramUniform3iv glProgramUniform3ui glProgramUniform3uiv glProgramUniform4f glProgramUniform4fv glProgramUniform4i glProgramUniform4iv glProgramUniform4ui glProgramUniform4uiv glProgramUniformMatrix2fv glProgramUniformMatrix2x3fv glProgramUniformMatrix2x4fv glProgramUniformMatrix3fv glProgramUniformMatrix3x2fv glProgramUniformMatrix3x4fv glProgramUniformMatrix4fv glProgramUniformMatrix4x2fv glProgramUniformMatrix4x3fv glProvokingVertex glPushDebugGroup glQueryCounter radians glReadBuffer glReadnPixels glReadPixels reflect refract glReleaseShaderCompiler removedTypes glRenderbufferStorage glRenderbufferStorageMultisample glResumeTransformFeedback round roundEven glSampleCoverage glSampleMaski glSamplerParameter glSamplerParameterf glSamplerParameterfv glSamplerParameteri glSamplerParameterIiv glSamplerParameterIuiv glSamplerParameteriv glScissor glScissorArray glScissorArrayv glScissorIndexed glScissorIndexedv glShaderBinary glShaderSource glShaderStorageBlockBinding sign sin sinh smoothstep sqrt glStencilFunc glStencilFuncSeparate glStencilMask glStencilMaskSeparate glStencilOp glStencilOpSeparate step tan tanh glTexBuffer glTexBufferRange texelFetch texelFetchOffset glTexImage1D glTexImage2D glTexImage2DMultisample glTexImage3D glTexImage3DMultisample glTexParameter glTexParameterf glTexParameterfv glTexParameteri glTexParameterIiv glTexParameterIuiv glTexParameteriv glTexStorage1D glTexStorage2D glTexStorage2DMultisample glTexStorage3D glTexStorage3DMultisample glTexSubImage1D glTexSubImage2D glTexSubImage3D texture glTextureBarrier glTextureBuffer glTextureBufferRange textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset glTextureParameterf glTextureParameterfv glTextureParameteri glTextureParameterIiv glTextureParameterIuiv glTextureParameteriv textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLevels textureQueryLod textureSamples textureSize glTextureStorage1D glTextureStorage2D glTextureStorage2DMultisample glTextureStorage3D glTextureStorage3DMultisample glTextureSubImage1D glTextureSubImage2D glTextureSubImage3D glTextureView glTransformFeedbackBufferBase glTransformFeedbackBufferRange glTransformFeedbackVaryings transpose trunc uaddCarry uintBitsToFloat umulExtended glUniform glUniform1f glUniform1fv glUniform1i glUniform1iv glUniform1ui glUniform1uiv glUniform2f glUniform2fv glUniform2i glUniform2iv glUniform2ui glUniform2uiv glUniform3f glUniform3fv glUniform3i glUniform3iv glUniform3ui glUniform3uiv glUniform4f glUniform4fv glUniform4i glUniform4iv glUniform4ui glUniform4uiv glUniformBlockBinding glUniformMatrix2fv glUniformMatrix2x3fv glUniformMatrix2x4fv glUniformMatrix3fv glUniformMatrix3x2fv glUniformMatrix3x4fv glUniformMatrix4fv glUniformMatrix4x2fv glUniformMatrix4x3fv glUniformSubroutines glUniformSubroutinesuiv glUnmapBuffer glUnmapNamedBuffer unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm unpackUnorm2x16 unpackUnorm4x8 glUseProgram glUseProgramStages usubBorrow glValidateProgram glValidateProgramPipeline glVertexArrayAttribBinding glVertexArrayAttribFormat glVertexArrayAttribIFormat glVertexArrayAttribLFormat glVertexArrayBindingDivisor glVertexArrayElementBuffer glVertexArrayVertexBuffer glVertexArrayVertexBuffers glVertexAttrib glVertexAttrib1d glVertexAttrib1dv glVertexAttrib1f glVertexAttrib1fv glVertexAttrib1s glVertexAttrib1sv glVertexAttrib2d glVertexAttrib2dv glVertexAttrib2f glVertexAttrib2fv glVertexAttrib2s glVertexAttrib2sv glVertexAttrib3d glVertexAttrib3dv glVertexAttrib3f glVertexAttrib3fv glVertexAttrib3s glVertexAttrib3sv glVertexAttrib4bv glVertexAttrib4d glVertexAttrib4dv glVertexAttrib4f glVertexAttrib4fv glVertexAttrib4iv glVertexAttrib4Nbv glVertexAttrib4Niv glVertexAttrib4Nsv glVertexAttrib4Nub glVertexAttrib4Nubv glVertexAttrib4Nuiv glVertexAttrib4Nusv glVertexAttrib4s glVertexAttrib4sv glVertexAttrib4ubv glVertexAttrib4uiv glVertexAttrib4usv glVertexAttribBinding glVertexAttribDivisor glVertexAttribFormat glVertexAttribI1i glVertexAttribI1iv glVertexAttribI1ui glVertexAttribI1uiv glVertexAttribI2i glVertexAttribI2iv glVertexAttribI2ui glVertexAttribI2uiv glVertexAttribI3i glVertexAttribI3iv glVertexAttribI3ui glVertexAttribI3uiv glVertexAttribI4bv glVertexAttribI4i glVertexAttribI4iv glVertexAttribI4sv glVertexAttribI4ubv glVertexAttribI4ui glVertexAttribI4uiv glVertexAttribI4usv glVertexAttribIFormat glVertexAttribIPointer glVertexAttribL1d glVertexAttribL1dv glVertexAttribL2d glVertexAttribL2dv glVertexAttribL3d glVertexAttribL3dv glVertexAttribL4d glVertexAttribL4dv glVertexAttribLFormat glVertexAttribLPointer glVertexAttribP1ui glVertexAttribP2ui glVertexAttribP3ui glVertexAttribP4ui glVertexAttribPointer glVertexBindingDivisor glViewport glViewportArray glViewportArrayv glViewportIndexed glViewportIndexedf glViewportIndexedfv glWaitSync gl_Position gl_PointSize gl_ClipVertex gl_FragCoord gl_FragFacing gl_FragColor gl_FragData gl_FragDepth gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogColor gl_ClipDistance gl_PrimitiveIDIn gl_InvocationID gl_PrimitiveID gl_Layer gl_ViewportIndex gl_TessCoord gl_PatchVerticesIn gl_TessLevelOuter gl_TessLevelInner gl_MaxPatchVertices gl_in gl_out gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttributes gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxDrawBuffers gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TextureMatrixInverse gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose gl_ModelViewProjectionMatrixTranspose gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormScale gl_DepthRangeParameters gl_DepthRange gl_ClipPlane gl_PointParameters gl_Point gl_MaterialParameters gl_FrontMaterial gl_BackMaterial gl_LightSourceParameters gl_LightSource gl_LightModelParameters gl_LightModel gl_LightModelProducts gl_FrontLightModelProduct gl_BackLightModelProduct gl_LightProducts gl_FrontLightProduct gl_BackLightProduct gl_TextureEnvColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_ObjectPlaneS gl_ObjectPlaneT gl_ObjectPlaneR gl_ObjectPlaneQ gl_FogParameters gl_Fog gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_Color gl_SecondaryColor diff --git a/autotests/syntaxrepository_test.cpp b/syntaxrepository_test.cpp similarity index 99% rename from autotests/syntaxrepository_test.cpp rename to syntaxrepository_test.cpp index 1915941..76a2db8 100644 --- a/autotests/syntaxrepository_test.cpp +++ b/syntaxrepository_test.cpp @@ -1,558 +1,559 @@ /* Copyright (C) 2016 Volker Krause Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "test-config.h" #include #include #include #include #include #include #include #include #include #include namespace KSyntaxHighlighting { class NullHighlighter : public AbstractHighlighter { public: using AbstractHighlighter::highlightLine; void applyFormat(int offset, int length, const Format &format) Q_DECL_OVERRIDE { Q_UNUSED(offset); Q_UNUSED(length); // only here to ensure we don't crash format.isDefaultTextStyle(theme()); format.textColor(theme()); } }; class RepositoryTest : public QObject { Q_OBJECT private: Repository m_repo; private Q_SLOTS: void initTestCase() { QStandardPaths::setTestModeEnabled(true); initRepositorySearchPaths(m_repo); } void testDefinitionByExtension_data() { QTest::addColumn("fileName"); QTest::addColumn("defName"); QTest::newRow("empty") << QString() << QString(); QTest::newRow("qml") << QStringLiteral("/bla/foo.qml") << QStringLiteral("QML"); QTest::newRow("glsl") << QStringLiteral("flat.frag") << QStringLiteral("GLSL"); // the following ones are defined in multiple syntax definitions QTest::newRow("c") << QStringLiteral("test.c") << QStringLiteral("C"); QTest::newRow("c++") << QStringLiteral("test.cpp") << QStringLiteral("C++"); + QTest::newRow("fs") << QStringLiteral("test.fs") << QStringLiteral("FSharp"); QTest::newRow("markdown") << QStringLiteral("test.md") << QStringLiteral("Markdown"); QTest::newRow("Makefile 1") << QStringLiteral("Makefile") << QStringLiteral("Makefile"); QTest::newRow("Makefile 2") << QStringLiteral("/some/path/to/Makefile") << QStringLiteral("Makefile"); QTest::newRow("Makefile 3") << QStringLiteral("Makefile.am") << QStringLiteral("Makefile"); } void testDefinitionByExtension() { QFETCH(QString, fileName); QFETCH(QString, defName); auto def = m_repo.definitionForFileName(fileName); if (defName.isEmpty()) { QVERIFY(!def.isValid()); } else { QVERIFY(def.isValid()); QCOMPARE(def.name(), defName); } } void testDefinitionsForFileName_data() { QTest::addColumn("fileName"); QTest::addColumn("expectedNames"); QTest::newRow("Matlab") << QStringLiteral("/bla/foo.m") << (QStringList() << QStringLiteral("Magma") << QStringLiteral("Matlab") << QStringLiteral("Octave") << QStringLiteral("Objective-C")); } void testDefinitionsForFileName() { QFETCH(QString, fileName); QFETCH(QStringList, expectedNames); const auto defs = m_repo.definitionsForFileName(fileName); QStringList names; for (auto def : defs) { names.push_back(def.name()); } QCOMPARE(names, expectedNames); } void testDefinitionsForMimeType_data() { QTest::addColumn("mimeType"); QTest::addColumn("expectedNames"); QTest::newRow("C Header") << QStringLiteral("text/x-chdr") << (QStringList() << QStringLiteral("C++") << QStringLiteral("ISO C++") << QStringLiteral("C") << QStringLiteral("GCCExtensions") << QStringLiteral("ANSI C89") << QStringLiteral("SystemC")); } void testDefinitionsForMimeType() { QFETCH(QString, mimeType); QFETCH(QStringList, expectedNames); const auto defs = m_repo.definitionsForMimeType(mimeType); QStringList names; for (auto def : defs) { names.push_back(def.name()); } QCOMPARE(names, expectedNames); } void testLoadAll() { for (const auto &def : m_repo.definitions()) { QVERIFY(!def.name().isEmpty()); QVERIFY(!def.translatedName().isEmpty()); QVERIFY(!def.isValid() || !def.section().isEmpty()); QVERIFY(!def.isValid() || !def.translatedSection().isEmpty()); // indirectly trigger loading, as we can't reach that from public API // if the loading fails the highlighter will produce empty states NullHighlighter hl; State initialState; hl.setDefinition(def); const auto state = hl.highlightLine(QLatin1String("This should not crash } ] ) !"), initialState); QVERIFY(!def.isValid() || state != initialState || def.name() == QLatin1String("Broken Syntax")); } } void testMetaData() { auto def = m_repo.definitionForName(QLatin1String("Alerts")); QVERIFY(def.isValid()); QVERIFY(def.extensions().isEmpty()); QVERIFY(def.mimeTypes().isEmpty()); QVERIFY(def.version() >= 1.11f); QVERIFY(def.isHidden()); QCOMPARE(def.section(), QLatin1String("Other")); QCOMPARE(def.license(), QLatin1String("MIT")); QVERIFY(def.author().contains(QLatin1String("Dominik"))); QFileInfo fi(def.filePath()); QVERIFY(fi.isAbsolute()); QVERIFY(def.filePath().endsWith(QLatin1String("alert.xml"))); def = m_repo.definitionForName(QLatin1String("C++")); QVERIFY(def.isValid()); QCOMPARE(def.section(), QLatin1String("Sources")); QCOMPARE(def.indenter(), QLatin1String("cstyle")); QCOMPARE(def.style(), QLatin1String("C++")); QVERIFY(def.mimeTypes().contains(QLatin1String("text/x-c++hdr"))); QVERIFY(def.extensions().contains(QLatin1String("*.h"))); QCOMPARE(def.priority(), 9); def = m_repo.definitionForName(QLatin1String("Apache Configuration")); QVERIFY(def.isValid()); QVERIFY(def.extensions().contains(QLatin1String("httpd.conf"))); QVERIFY(def.extensions().contains(QLatin1String(".htaccess*"))); } void testGeneralMetaData() { auto def = m_repo.definitionForName(QLatin1String("C++")); QVERIFY(def.isValid()); QVERIFY(!def.indentationBasedFoldingEnabled()); // comment markers QCOMPARE(def.singleLineCommentMarker(), QLatin1String("//")); QCOMPARE(def.singleLineCommentPosition(), KSyntaxHighlighting::CommentPosition::StartOfLine); const auto cppMultiLineCommentMarker = QPair(QLatin1String("/*"), QLatin1String("*/")); QCOMPARE(def.multiLineCommentMarker(), cppMultiLineCommentMarker); def = m_repo.definitionForName(QLatin1String("Python")); QVERIFY(def.isValid()); // indentation QVERIFY(def.indentationBasedFoldingEnabled()); QCOMPARE(def.foldingIgnoreList(), QStringList() << QLatin1String("(?:\\s+|\\s*#.*)")); // keyword lists QVERIFY(!def.keywordLists().isEmpty()); QVERIFY(def.keywordList(QLatin1String("operators")).contains(QLatin1String("and"))); QVERIFY(!def.keywordList(QLatin1String("does not exits")).contains(QLatin1String("and"))); } void testFormatData() { auto def = m_repo.definitionForName(QLatin1String("ChangeLog")); QVERIFY(def.isValid()); auto formats = def.formats(); QVERIFY(!formats.isEmpty()); // verify that the formats are sorted, such that the order matches the order of the itemDatas in the xml files. auto sortComparator = [](const KSyntaxHighlighting::Format & lhs, const KSyntaxHighlighting::Format & rhs) { return lhs.id() < rhs.id(); }; QVERIFY(std::is_sorted(formats.begin(), formats.end(), sortComparator)); // check all names are listed QStringList formatNames; for (const auto & format : qAsConst(formats)) { formatNames.append(format.name()); } const QStringList expectedItemDatas = { QStringLiteral("Normal Text"), QStringLiteral("Name"), QStringLiteral("E-Mail"), QStringLiteral("Date"), QStringLiteral("Entry") }; QCOMPARE(formatNames, expectedItemDatas); } void testIncludedDefinitions() { auto def = m_repo.definitionForName(QLatin1String("PHP (HTML)")); QVERIFY(def.isValid()); auto defs = def.includedDefinitions(); const QStringList expectedDefinitionNames = { QStringLiteral("PHP/PHP"), QStringLiteral("Alerts"), QStringLiteral("CSS/PHP"), QStringLiteral("JavaScript/PHP"), QStringLiteral("Doxygen"), QStringLiteral("JavaScript React/PHP"), QStringLiteral("TypeScript/PHP"), QStringLiteral("Mustache/Handlebars (HTML)/PHP"), QStringLiteral("Modelines"), QStringLiteral("HTML"), QStringLiteral("CSS"), QStringLiteral("SQL (MySQL)"), QStringLiteral("JavaScript"), QStringLiteral("JavaScript React"), QStringLiteral("TypeScript"), QStringLiteral("Mustache/Handlebars (HTML)") }; QStringList definitionNames; for (auto d : defs) { QVERIFY(d.isValid()); definitionNames.push_back(d.name()); // already check here a bit to make the test fails better fixable if (definitionNames.size() <= expectedDefinitionNames.size()) { QCOMPARE(d.name(), expectedDefinitionNames[definitionNames.size()-1]); } else { QCOMPARE(d.name(), QStringLiteral("too many included defs found, first one is this one")); } } QCOMPARE(definitionNames, expectedDefinitionNames); } void testIncludedFormats() { QStringList definitionNames; for (const auto &def : m_repo.definitions()) { definitionNames.push_back(def.name()); } for (const QString & name : qAsConst(definitionNames)) { Repository repo; initRepositorySearchPaths(repo); auto def = repo.definitionForName(name); QCOMPARE(m_repo.definitionForName(name).isValid(), def.isValid()); auto includedDefs = def.includedDefinitions(); includedDefs.push_front(def); // collect all formats, shall be numbered from 1.. QSet formatIds; for (auto d : qAsConst(includedDefs)) { const auto formats = d.formats(); for (const auto format : formats) { // no duplicates QVERIFY(!formatIds.contains(format.id())); formatIds.insert(format.id()); } } QVERIFY(!def.isValid() || def.name() == QLatin1String("Broken Syntax") || !formatIds.isEmpty()); // ensure all ids are there from 1..size for (int i = 1; i <= formatIds.size(); ++i) { QVERIFY(formatIds.contains(i)); } } } void testReload() { auto def = m_repo.definitionForName(QLatin1String("QML")); QVERIFY(!m_repo.definitions().isEmpty()); QVERIFY(def.isValid()); NullHighlighter hl; hl.setDefinition(def); auto oldState = hl.highlightLine(QLatin1String("/* TODO this should not crash */"), State()); m_repo.reload(); QVERIFY(!m_repo.definitions().isEmpty()); QVERIFY(!def.isValid()); hl.highlightLine(QLatin1String("/* TODO this should not crash */"), State()); hl.highlightLine(QLatin1String("/* FIXME neither should this crash */"), oldState); QVERIFY(hl.definition().isValid()); QCOMPARE(hl.definition().name(), QLatin1String("QML")); } void testLifetime() { // common mistake with value-type like Repo API, make sure this doesn'T crash NullHighlighter hl; { Repository repo; hl.setDefinition(repo.definitionForName(QLatin1String("C++"))); hl.setTheme(repo.defaultTheme()); } hl.highlightLine(QLatin1String("/**! @todo this should not crash .*/"), State()); } void testCustomPath() { QString testInputPath = QStringLiteral(TESTSRCDIR "/input"); Repository repo; QVERIFY(repo.customSearchPaths().empty()); repo.addCustomSearchPath(testInputPath); QCOMPARE(repo.customSearchPaths().size(), 1); QCOMPARE(repo.customSearchPaths()[0], testInputPath); auto customDefinition = repo.definitionForName(QLatin1String("Test Syntax")); QVERIFY(customDefinition.isValid()); auto customTheme = repo.theme(QLatin1String("Test Theme")); QVERIFY(customTheme.isValid()); } void testInvalidDefinition() { Definition def; QVERIFY(!def.isValid()); QVERIFY(def.filePath().isEmpty()); QCOMPARE(def.name(), QLatin1String("None")); QVERIFY(def.section().isEmpty()); QVERIFY(def.translatedSection().isEmpty()); QVERIFY(def.mimeTypes().isEmpty()); QVERIFY(def.extensions().isEmpty()); QCOMPARE(def.version(), 0); QCOMPARE(def.priority(), 0); QVERIFY(!def.isHidden()); QVERIFY(def.style().isEmpty()); QVERIFY(def.indenter().isEmpty()); QVERIFY(def.author().isEmpty()); QVERIFY(def.license().isEmpty()); QVERIFY(!def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); QVERIFY(def.foldingIgnoreList().isEmpty()); QVERIFY(def.keywordLists().isEmpty()); QVERIFY(def.formats().isEmpty()); QVERIFY(def.includedDefinitions().isEmpty()); QVERIFY(def.singleLineCommentMarker().isEmpty()); QCOMPARE(def.singleLineCommentPosition(), KSyntaxHighlighting::CommentPosition::StartOfLine); const auto emptyPair = QPair(); QCOMPARE(def.multiLineCommentMarker(), emptyPair); QVERIFY(def.characterEncodings().isEmpty()); for (QChar c : QStringLiteral("\t !%&()*+,-./:;<=>?[\\]^{|}~")) { QVERIFY(def.isWordDelimiter(c)); QVERIFY(def.isWordWrapDelimiter(c)); } } void testDelimiters() { auto def = m_repo.definitionForName(QLatin1String("LaTeX")); QVERIFY(def.isValid()); // check that backslash '\' and '*' are removed for (QChar c : QStringLiteral("\t !%&()+,-./:;<=>?[]^{|}~")) QVERIFY(def.isWordDelimiter(c)); QVERIFY(!def.isWordDelimiter(QLatin1Char('\\'))); // check where breaking a line is valid for (QChar c : QStringLiteral(",{}[]")) QVERIFY(def.isWordWrapDelimiter(c)); } void testFoldingEnabled() { // test invalid folding Definition def; QVERIFY(!def.isValid()); QVERIFY(!def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); // test no folding def = m_repo.definitionForName(QLatin1String("ChangeLog")); QVERIFY(def.isValid()); QVERIFY(!def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); // C++ itself has no regions, but it includes ISO C++ def = m_repo.definitionForName(QLatin1String("C++")); QVERIFY(def.isValid()); QVERIFY(def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); // ISO C++ itself has folding regions def = m_repo.definitionForName(QLatin1String("ISO C++")); QVERIFY(def.isValid()); QVERIFY(def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); // Python has indentation based folding def = m_repo.definitionForName(QLatin1String("Python")); QVERIFY(def.isValid()); QVERIFY(def.foldingEnabled()); QVERIFY(def.indentationBasedFoldingEnabled()); } void testCharacterEncodings() { auto def = m_repo.definitionForName(QLatin1String("LaTeX")); QVERIFY(def.isValid()); const auto encodings = def.characterEncodings(); QVERIFY(!encodings.isEmpty()); QVERIFY(encodings.contains({ QChar(196), QLatin1String("\\\"{A}") })); QVERIFY(encodings.contains({ QChar(227), QLatin1String("\\~{a}") })); } void testIncludeKeywordLists() { Repository repo; QTemporaryDir dir; // forge a syntax file { QVERIFY(QDir(dir.path()).mkpath(QLatin1String("syntax"))); const char syntax[] = R"xml( c a b a c b d e##AAA e f f )xml"; QFile file(dir.path() + QLatin1String("/syntax/a.xml")); QVERIFY(file.open(QIODevice::WriteOnly)); QTextStream stream(&file); stream << syntax; } repo.addCustomSearchPath(dir.path()); auto def = repo.definitionForName(QLatin1String("AAA")); QCOMPARE(def.name(), QLatin1String("AAA")); auto klist1 = def.keywordList(QLatin1String("a")); auto klist2 = def.keywordList(QLatin1String("b")); auto klist3 = def.keywordList(QLatin1String("c")); // internal QHash is arbitrarily ordered and undeterministic auto& klist = klist1.size() == 3 ? klist1 : klist2.size() == 3 ? klist2 : klist3; QCOMPARE(klist.size(), 3); QVERIFY(klist.contains(QLatin1String("a"))); QVERIFY(klist.contains(QLatin1String("b"))); QVERIFY(klist.contains(QLatin1String("c"))); klist = def.keywordList(QLatin1String("d")); QCOMPARE(klist.size(), 3); QVERIFY(klist.contains(QLatin1String("d"))); QVERIFY(klist.contains(QLatin1String("e"))); QVERIFY(klist.contains(QLatin1String("f"))); klist = def.keywordList(QLatin1String("e")); QCOMPARE(klist.size(), 2); QVERIFY(klist.contains(QLatin1String("e"))); QVERIFY(klist.contains(QLatin1String("f"))); klist = def.keywordList(QLatin1String("f")); QCOMPARE(klist.size(), 1); QVERIFY(klist.contains(QLatin1String("f"))); } }; } QTEST_GUILESS_MAIN(KSyntaxHighlighting::RepositoryTest) #include "syntaxrepository_test.moc"