From 0d35b1ae6ba1f830073036e07d680c7ded75500b Mon Sep 17 00:00:00 2001 From: Nripesh Niketan Date: Sun, 21 Jun 2026 14:53:02 +0100 Subject: [PATCH] Consolidate duplicate isFloatVectorType predicates into TypeSemantics isFloatVectorType was defined three times (HIR.cpp HIRType overload, Intrinsics.cpp string_view + HIRType overloads), each enumerating the float vector types (vec2/vec3/vec4). Replace them with canonical crossgl::isFloatVectorType overloads in TypeSemantics. Two file-local callers are made explicit (std::string_view{...}) since HIRType is implicitly constructible from a string. Continues #33/#34. --- include/crossgl/HIR/TypeSemantics.h | 2 ++ src/HIR/HIR.cpp | 6 ------ src/HIR/Intrinsics.cpp | 19 ++----------------- src/HIR/TypeSemantics.cpp | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/include/crossgl/HIR/TypeSemantics.h b/include/crossgl/HIR/TypeSemantics.h index a58b602e1..b06216c85 100644 --- a/include/crossgl/HIR/TypeSemantics.h +++ b/include/crossgl/HIR/TypeSemantics.h @@ -66,6 +66,8 @@ bool isNumericScalarTypeName(std::string_view name); bool isFloatLike(std::string_view name); bool isVectorType(std::string_view name); bool isNumericVectorTypeName(std::string_view name); +bool isFloatVectorType(std::string_view name); +bool isFloatVectorType(const HIRType &type); bool isMatrixType(std::string_view name); bool isScalarAggregateTypePair(const HIRType &left, const HIRType &right); bool shouldDiagnoseTypeMismatch(const HIRType &expected, const HIRType &actual); diff --git a/src/HIR/HIR.cpp b/src/HIR/HIR.cpp index 44bc38d5c..0076634fd 100644 --- a/src/HIR/HIR.cpp +++ b/src/HIR/HIR.cpp @@ -659,12 +659,6 @@ bool isComputeInvocationBuiltinIntConversion(const HIRExpression &expression, isComputeInvocationBuiltinComponentAccess(expression.children.front()); } -bool isFloatVectorType(const HIRType &type) { - const std::string name = baseTypeName(type); - return !type.arraySize.has_value() && - (name == "vec2" || name == "vec3" || name == "vec4"); -} - std::optional matrixDimensionFromHIRTypeName(std::string_view name) { if (name == "mat2" || name == "mat2x2") { return std::size_t{2}; diff --git a/src/HIR/Intrinsics.cpp b/src/HIR/Intrinsics.cpp index 0fca72945..d8d81fad0 100644 --- a/src/HIR/Intrinsics.cpp +++ b/src/HIR/Intrinsics.cpp @@ -177,13 +177,6 @@ std::string formatArgumentCount(std::size_t count) { return std::to_string(count) + (count == 1 ? " argument" : " arguments"); } -bool isFloatVectorType(std::string_view baseName) { - if (!isVectorType(baseName)) { - return false; - } - return isFloatLike(baseTypeName(scalarTypeForVector(baseName))); -} - bool isNumericValueType(const HIRType &type) { if (type.name.empty() || type.arraySize.has_value()) { return false; @@ -206,7 +199,7 @@ bool isFloatValueType(const HIRType &type) { return false; } const std::string baseName = baseTypeName(type); - return isFloatLike(baseName) || isFloatVectorType(baseName) || + return isFloatLike(baseName) || isFloatVectorType(std::string_view{baseName}) || isMatrixType(baseName); } @@ -229,15 +222,7 @@ bool isFloatScalarOrVectorType(const HIRType &type) { return false; } const std::string baseName = baseTypeName(type); - return isFloatLike(baseName) || isFloatVectorType(baseName); -} - -bool isFloatVectorType(const HIRType &type) { - if (type.name.empty() || type.arraySize.has_value()) { - return false; - } - const std::string baseName = baseTypeName(type); - return isFloatVectorType(std::string_view{baseName}); + return isFloatLike(baseName) || isFloatVectorType(std::string_view{baseName}); } bool isFloatVector3Type(const HIRType &type) { diff --git a/src/HIR/TypeSemantics.cpp b/src/HIR/TypeSemantics.cpp index 229975cbf..512164e50 100644 --- a/src/HIR/TypeSemantics.cpp +++ b/src/HIR/TypeSemantics.cpp @@ -455,6 +455,21 @@ bool isNumericVectorTypeName(std::string_view name) { return isVectorType(name) && !name.starts_with("bvec"); } +bool isFloatVectorType(std::string_view name) { + // Vector types whose component type is float-like (vecN); ivecN/uvecN/bvecN + // are excluded. + return isVectorType(name) && + isFloatLike(baseTypeName(scalarTypeForVector(name))); +} + +bool isFloatVectorType(const HIRType &type) { + if (type.arraySize.has_value()) { + return false; + } + const std::string name = baseTypeName(type); + return isFloatVectorType(std::string_view{name}); +} + bool isMatrixType(std::string_view name) { return name == "mat2" || name == "mat3" || name == "mat4" || name == "mat2x2" || name == "mat3x3" || name == "mat4x4";