|
24 | 24 | */
|
25 | 25 |
|
26 | 26 | LUAU_FASTFLAG(DebugLuauDeferredConstraintResolution);
|
27 |
| -LUAU_FASTFLAGVARIABLE(LuauMakeStringMethodsChecked, false); |
28 | 27 |
|
29 | 28 | namespace Luau
|
30 | 29 | {
|
@@ -773,153 +772,87 @@ TypeId makeStringMetatable(NotNull<BuiltinTypes> builtinTypes)
|
773 | 772 | const TypePackId numberVariadicList = arena->addTypePack(TypePackVar{VariadicTypePack{numberType}});
|
774 | 773 |
|
775 | 774 |
|
776 |
| - if (FFlag::LuauMakeStringMethodsChecked) |
777 |
| - { |
778 |
| - FunctionType formatFTV{arena->addTypePack(TypePack{{stringType}, variadicTailPack}), oneStringPack}; |
779 |
| - formatFTV.magicFunction = &magicFunctionFormat; |
780 |
| - formatFTV.isCheckedFunction = true; |
781 |
| - const TypeId formatFn = arena->addType(formatFTV); |
782 |
| - attachDcrMagicFunction(formatFn, dcrMagicFunctionFormat); |
783 |
| - |
784 |
| - |
785 |
| - const TypeId stringToStringType = makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType}, /* checked */ true); |
786 |
| - |
787 |
| - const TypeId replArgType = arena->addType( |
788 |
| - UnionType{{stringType, arena->addType(TableType({}, TableIndexer(stringType, stringType), TypeLevel{}, TableState::Generic)), |
789 |
| - makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType}, /* checked */ false)}}); |
790 |
| - const TypeId gsubFunc = |
791 |
| - makeFunction(*arena, stringType, {}, {}, {stringType, replArgType, optionalNumber}, {}, {stringType, numberType}, /* checked */ false); |
792 |
| - const TypeId gmatchFunc = makeFunction( |
793 |
| - *arena, stringType, {}, {}, {stringType}, {}, {arena->addType(FunctionType{emptyPack, stringVariadicList})}, /* checked */ true); |
794 |
| - attachMagicFunction(gmatchFunc, magicFunctionGmatch); |
795 |
| - attachDcrMagicFunction(gmatchFunc, dcrMagicFunctionGmatch); |
796 |
| - |
797 |
| - FunctionType matchFuncTy{ |
798 |
| - arena->addTypePack({stringType, stringType, optionalNumber}), arena->addTypePack(TypePackVar{VariadicTypePack{stringType}})}; |
799 |
| - matchFuncTy.isCheckedFunction = true; |
800 |
| - const TypeId matchFunc = arena->addType(matchFuncTy); |
801 |
| - attachMagicFunction(matchFunc, magicFunctionMatch); |
802 |
| - attachDcrMagicFunction(matchFunc, dcrMagicFunctionMatch); |
803 |
| - |
804 |
| - FunctionType findFuncTy{arena->addTypePack({stringType, stringType, optionalNumber, optionalBoolean}), |
805 |
| - arena->addTypePack(TypePack{{optionalNumber, optionalNumber}, stringVariadicList})}; |
806 |
| - findFuncTy.isCheckedFunction = true; |
807 |
| - const TypeId findFunc = arena->addType(findFuncTy); |
808 |
| - attachMagicFunction(findFunc, magicFunctionFind); |
809 |
| - attachDcrMagicFunction(findFunc, dcrMagicFunctionFind); |
810 |
| - |
811 |
| - // string.byte : string -> number? -> number? -> ...number |
812 |
| - FunctionType stringDotByte{arena->addTypePack({stringType, optionalNumber, optionalNumber}), numberVariadicList}; |
813 |
| - stringDotByte.isCheckedFunction = true; |
814 |
| - |
815 |
| - // string.char : .... number -> string |
816 |
| - FunctionType stringDotChar{numberVariadicList, arena->addTypePack({stringType})}; |
817 |
| - stringDotChar.isCheckedFunction = true; |
818 |
| - |
819 |
| - // string.unpack : string -> string -> number? -> ...any |
820 |
| - FunctionType stringDotUnpack{ |
821 |
| - arena->addTypePack(TypePack{{stringType, stringType, optionalNumber}}), |
822 |
| - variadicTailPack, |
823 |
| - }; |
824 |
| - stringDotUnpack.isCheckedFunction = true; |
825 |
| - |
826 |
| - TableType::Props stringLib = { |
827 |
| - {"byte", {arena->addType(stringDotByte)}}, |
828 |
| - {"char", {arena->addType(stringDotChar)}}, |
829 |
| - {"find", {findFunc}}, |
830 |
| - {"format", {formatFn}}, // FIXME |
831 |
| - {"gmatch", {gmatchFunc}}, |
832 |
| - {"gsub", {gsubFunc}}, |
833 |
| - {"len", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType}, /* checked */ true)}}, |
834 |
| - {"lower", {stringToStringType}}, |
835 |
| - {"match", {matchFunc}}, |
836 |
| - {"rep", {makeFunction(*arena, stringType, {}, {}, {numberType}, {}, {stringType}, /* checked */ true)}}, |
837 |
| - {"reverse", {stringToStringType}}, |
838 |
| - {"sub", {makeFunction(*arena, stringType, {}, {}, {numberType, optionalNumber}, {}, {stringType}, /* checked */ true)}}, |
839 |
| - {"upper", {stringToStringType}}, |
840 |
| - {"split", {makeFunction(*arena, stringType, {}, {}, {optionalString}, {}, |
841 |
| - {arena->addType(TableType{{}, TableIndexer{numberType, stringType}, TypeLevel{}, TableState::Sealed})}, |
842 |
| - /* checked */ true)}}, |
843 |
| - {"pack", {arena->addType(FunctionType{ |
844 |
| - arena->addTypePack(TypePack{{stringType}, variadicTailPack}), |
845 |
| - oneStringPack, |
846 |
| - })}}, |
847 |
| - {"packsize", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType}, /* checked */ true)}}, |
848 |
| - {"unpack", {arena->addType(stringDotUnpack)}}, |
849 |
| - }; |
850 |
| - assignPropDocumentationSymbols(stringLib, "@luau/global/string"); |
851 |
| - |
852 |
| - TypeId tableType = arena->addType(TableType{std::move(stringLib), std::nullopt, TypeLevel{}, TableState::Sealed}); |
853 |
| - |
854 |
| - if (TableType* ttv = getMutable<TableType>(tableType)) |
855 |
| - ttv->name = "typeof(string)"; |
856 |
| - |
857 |
| - return arena->addType(TableType{{{{"__index", {tableType}}}}, std::nullopt, TypeLevel{}, TableState::Sealed}); |
858 |
| - } |
859 |
| - else |
860 |
| - { |
861 |
| - FunctionType formatFTV{arena->addTypePack(TypePack{{stringType}, variadicTailPack}), oneStringPack}; |
862 |
| - formatFTV.magicFunction = &magicFunctionFormat; |
863 |
| - const TypeId formatFn = arena->addType(formatFTV); |
864 |
| - attachDcrMagicFunction(formatFn, dcrMagicFunctionFormat); |
865 |
| - |
866 |
| - const TypeId stringToStringType = makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType}); |
867 |
| - |
868 |
| - const TypeId replArgType = arena->addType( |
869 |
| - UnionType{{stringType, arena->addType(TableType({}, TableIndexer(stringType, stringType), TypeLevel{}, TableState::Generic)), |
870 |
| - makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType})}}); |
871 |
| - const TypeId gsubFunc = makeFunction(*arena, stringType, {}, {}, {stringType, replArgType, optionalNumber}, {}, {stringType, numberType}); |
872 |
| - const TypeId gmatchFunc = |
873 |
| - makeFunction(*arena, stringType, {}, {}, {stringType}, {}, {arena->addType(FunctionType{emptyPack, stringVariadicList})}); |
874 |
| - attachMagicFunction(gmatchFunc, magicFunctionGmatch); |
875 |
| - attachDcrMagicFunction(gmatchFunc, dcrMagicFunctionGmatch); |
876 |
| - |
877 |
| - const TypeId matchFunc = arena->addType(FunctionType{ |
878 |
| - arena->addTypePack({stringType, stringType, optionalNumber}), arena->addTypePack(TypePackVar{VariadicTypePack{stringType}})}); |
879 |
| - attachMagicFunction(matchFunc, magicFunctionMatch); |
880 |
| - attachDcrMagicFunction(matchFunc, dcrMagicFunctionMatch); |
881 |
| - |
882 |
| - const TypeId findFunc = arena->addType(FunctionType{arena->addTypePack({stringType, stringType, optionalNumber, optionalBoolean}), |
883 |
| - arena->addTypePack(TypePack{{optionalNumber, optionalNumber}, stringVariadicList})}); |
884 |
| - attachMagicFunction(findFunc, magicFunctionFind); |
885 |
| - attachDcrMagicFunction(findFunc, dcrMagicFunctionFind); |
886 |
| - |
887 |
| - TableType::Props stringLib = { |
888 |
| - {"byte", {arena->addType(FunctionType{arena->addTypePack({stringType, optionalNumber, optionalNumber}), numberVariadicList})}}, |
889 |
| - {"char", {arena->addType(FunctionType{numberVariadicList, arena->addTypePack({stringType})})}}, |
890 |
| - {"find", {findFunc}}, |
891 |
| - {"format", {formatFn}}, // FIXME |
892 |
| - {"gmatch", {gmatchFunc}}, |
893 |
| - {"gsub", {gsubFunc}}, |
894 |
| - {"len", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType})}}, |
895 |
| - {"lower", {stringToStringType}}, |
896 |
| - {"match", {matchFunc}}, |
897 |
| - {"rep", {makeFunction(*arena, stringType, {}, {}, {numberType}, {}, {stringType})}}, |
898 |
| - {"reverse", {stringToStringType}}, |
899 |
| - {"sub", {makeFunction(*arena, stringType, {}, {}, {numberType, optionalNumber}, {}, {stringType})}}, |
900 |
| - {"upper", {stringToStringType}}, |
901 |
| - {"split", {makeFunction(*arena, stringType, {}, {}, {optionalString}, {}, |
902 |
| - {arena->addType(TableType{{}, TableIndexer{numberType, stringType}, TypeLevel{}, TableState::Sealed})})}}, |
903 |
| - {"pack", {arena->addType(FunctionType{ |
904 |
| - arena->addTypePack(TypePack{{stringType}, variadicTailPack}), |
905 |
| - oneStringPack, |
906 |
| - })}}, |
907 |
| - {"packsize", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType})}}, |
908 |
| - {"unpack", {arena->addType(FunctionType{ |
909 |
| - arena->addTypePack(TypePack{{stringType, stringType, optionalNumber}}), |
910 |
| - variadicTailPack, |
911 |
| - })}}, |
912 |
| - }; |
913 |
| - |
914 |
| - assignPropDocumentationSymbols(stringLib, "@luau/global/string"); |
915 |
| - |
916 |
| - TypeId tableType = arena->addType(TableType{std::move(stringLib), std::nullopt, TypeLevel{}, TableState::Sealed}); |
917 |
| - |
918 |
| - if (TableType* ttv = getMutable<TableType>(tableType)) |
919 |
| - ttv->name = "typeof(string)"; |
920 |
| - |
921 |
| - return arena->addType(TableType{{{{"__index", {tableType}}}}, std::nullopt, TypeLevel{}, TableState::Sealed}); |
922 |
| - } |
| 775 | + FunctionType formatFTV{arena->addTypePack(TypePack{{stringType}, variadicTailPack}), oneStringPack}; |
| 776 | + formatFTV.magicFunction = &magicFunctionFormat; |
| 777 | + formatFTV.isCheckedFunction = true; |
| 778 | + const TypeId formatFn = arena->addType(formatFTV); |
| 779 | + attachDcrMagicFunction(formatFn, dcrMagicFunctionFormat); |
| 780 | + |
| 781 | + |
| 782 | + const TypeId stringToStringType = makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType}, /* checked */ true); |
| 783 | + |
| 784 | + const TypeId replArgType = |
| 785 | + arena->addType(UnionType{{stringType, arena->addType(TableType({}, TableIndexer(stringType, stringType), TypeLevel{}, TableState::Generic)), |
| 786 | + makeFunction(*arena, std::nullopt, {}, {}, {stringType}, {}, {stringType}, /* checked */ false)}}); |
| 787 | + const TypeId gsubFunc = |
| 788 | + makeFunction(*arena, stringType, {}, {}, {stringType, replArgType, optionalNumber}, {}, {stringType, numberType}, /* checked */ false); |
| 789 | + const TypeId gmatchFunc = |
| 790 | + makeFunction(*arena, stringType, {}, {}, {stringType}, {}, {arena->addType(FunctionType{emptyPack, stringVariadicList})}, /* checked */ true); |
| 791 | + attachMagicFunction(gmatchFunc, magicFunctionGmatch); |
| 792 | + attachDcrMagicFunction(gmatchFunc, dcrMagicFunctionGmatch); |
| 793 | + |
| 794 | + FunctionType matchFuncTy{ |
| 795 | + arena->addTypePack({stringType, stringType, optionalNumber}), arena->addTypePack(TypePackVar{VariadicTypePack{stringType}})}; |
| 796 | + matchFuncTy.isCheckedFunction = true; |
| 797 | + const TypeId matchFunc = arena->addType(matchFuncTy); |
| 798 | + attachMagicFunction(matchFunc, magicFunctionMatch); |
| 799 | + attachDcrMagicFunction(matchFunc, dcrMagicFunctionMatch); |
| 800 | + |
| 801 | + FunctionType findFuncTy{arena->addTypePack({stringType, stringType, optionalNumber, optionalBoolean}), |
| 802 | + arena->addTypePack(TypePack{{optionalNumber, optionalNumber}, stringVariadicList})}; |
| 803 | + findFuncTy.isCheckedFunction = true; |
| 804 | + const TypeId findFunc = arena->addType(findFuncTy); |
| 805 | + attachMagicFunction(findFunc, magicFunctionFind); |
| 806 | + attachDcrMagicFunction(findFunc, dcrMagicFunctionFind); |
| 807 | + |
| 808 | + // string.byte : string -> number? -> number? -> ...number |
| 809 | + FunctionType stringDotByte{arena->addTypePack({stringType, optionalNumber, optionalNumber}), numberVariadicList}; |
| 810 | + stringDotByte.isCheckedFunction = true; |
| 811 | + |
| 812 | + // string.char : .... number -> string |
| 813 | + FunctionType stringDotChar{numberVariadicList, arena->addTypePack({stringType})}; |
| 814 | + stringDotChar.isCheckedFunction = true; |
| 815 | + |
| 816 | + // string.unpack : string -> string -> number? -> ...any |
| 817 | + FunctionType stringDotUnpack{ |
| 818 | + arena->addTypePack(TypePack{{stringType, stringType, optionalNumber}}), |
| 819 | + variadicTailPack, |
| 820 | + }; |
| 821 | + stringDotUnpack.isCheckedFunction = true; |
| 822 | + |
| 823 | + TableType::Props stringLib = { |
| 824 | + {"byte", {arena->addType(stringDotByte)}}, |
| 825 | + {"char", {arena->addType(stringDotChar)}}, |
| 826 | + {"find", {findFunc}}, |
| 827 | + {"format", {formatFn}}, // FIXME |
| 828 | + {"gmatch", {gmatchFunc}}, |
| 829 | + {"gsub", {gsubFunc}}, |
| 830 | + {"len", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType}, /* checked */ true)}}, |
| 831 | + {"lower", {stringToStringType}}, |
| 832 | + {"match", {matchFunc}}, |
| 833 | + {"rep", {makeFunction(*arena, stringType, {}, {}, {numberType}, {}, {stringType}, /* checked */ true)}}, |
| 834 | + {"reverse", {stringToStringType}}, |
| 835 | + {"sub", {makeFunction(*arena, stringType, {}, {}, {numberType, optionalNumber}, {}, {stringType}, /* checked */ true)}}, |
| 836 | + {"upper", {stringToStringType}}, |
| 837 | + {"split", {makeFunction(*arena, stringType, {}, {}, {optionalString}, {}, |
| 838 | + {arena->addType(TableType{{}, TableIndexer{numberType, stringType}, TypeLevel{}, TableState::Sealed})}, |
| 839 | + /* checked */ true)}}, |
| 840 | + {"pack", {arena->addType(FunctionType{ |
| 841 | + arena->addTypePack(TypePack{{stringType}, variadicTailPack}), |
| 842 | + oneStringPack, |
| 843 | + })}}, |
| 844 | + {"packsize", {makeFunction(*arena, stringType, {}, {}, {}, {}, {numberType}, /* checked */ true)}}, |
| 845 | + {"unpack", {arena->addType(stringDotUnpack)}}, |
| 846 | + }; |
| 847 | + |
| 848 | + assignPropDocumentationSymbols(stringLib, "@luau/global/string"); |
| 849 | + |
| 850 | + TypeId tableType = arena->addType(TableType{std::move(stringLib), std::nullopt, TypeLevel{}, TableState::Sealed}); |
| 851 | + |
| 852 | + if (TableType* ttv = getMutable<TableType>(tableType)) |
| 853 | + ttv->name = "typeof(string)"; |
| 854 | + |
| 855 | + return arena->addType(TableType{{{{"__index", {tableType}}}}, std::nullopt, TypeLevel{}, TableState::Sealed}); |
923 | 856 | }
|
924 | 857 |
|
925 | 858 | static std::optional<WithPredicate<TypePackId>> magicFunctionSelect(
|
|
0 commit comments