001package gudusoft.gsqlparser.ir.builder.mssql;
002
003import gudusoft.gsqlparser.ir.bound.BoundTypeRef;
004import gudusoft.gsqlparser.ir.bound.ETypeCategory;
005import gudusoft.gsqlparser.nodes.TTypeName;
006
007/**
008 * Maps T-SQL type names to {@link BoundTypeRef} instances.
009 */
010public final class MssqlTypeRefMapper {
011
012    private MssqlTypeRefMapper() {}
013
014    /**
015     * Creates a {@link BoundTypeRef} from a GSP {@link TTypeName}.
016     *
017     * @param typeName AST type name node
018     * @return bound type reference, or null if typeName is null
019     */
020    public static BoundTypeRef map(TTypeName typeName) {
021        if (typeName == null) {
022            return null;
023        }
024        String typeText = typeName.toString().trim();
025        ETypeCategory category = inferCategory(typeText);
026        return new BoundTypeRef(typeText, category);
027    }
028
029    /**
030     * Creates a {@link BoundTypeRef} from a raw type string.
031     */
032    public static BoundTypeRef fromString(String typeText) {
033        if (typeText == null || typeText.trim().isEmpty()) {
034            return null;
035        }
036        return new BoundTypeRef(typeText.trim(), inferCategory(typeText.trim()));
037    }
038
039    private static ETypeCategory inferCategory(String typeText) {
040        String upper = typeText.toUpperCase();
041        if (upper.startsWith("TABLE")) {
042            return ETypeCategory.TABLE_OF;
043        }
044        if (upper.contains("CURSOR")) {
045            return ETypeCategory.REF_CURSOR;
046        }
047        return ETypeCategory.SCALAR;
048    }
049}