diff --git a/generated/lua_keywords_pretty.xml b/generated/lua_keywords_pretty.xml index 50769f7a..c528f04e 100644 --- a/generated/lua_keywords_pretty.xml +++ b/generated/lua_keywords_pretty.xml @@ -131,7 +131,7 @@ This file is auto-generated by https://github.com/secondlife/lsl-definitions. -- number tooltip - Double‑precision floating point number. + Double‑precision (64-bit) floating point number. string diff --git a/generated/syntax/slua.tmLanguage b/generated/syntax/slua.tmLanguage index 0c3ac245..8b0f881f 100644 --- a/generated/syntax/slua.tmLanguage +++ b/generated/syntax/slua.tmLanguage @@ -488,19 +488,19 @@ name constant.numeric.hex.luau match - \b0_*[xX]_*[\da-fA-F_]*(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + \b0_*[xX]_*[\da-fA-F_]*(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? name constant.numeric.binary.luau match - \b0_*[bB][01_]+(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + \b0_*[bB][01_]+(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? name constant.numeric.decimal.luau match - (?:\d[\d_]*(?:\.[\d_]*)?|\.\d[\d_]*)(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + (?:\d[\d_]*(?:\.[\d_]*)?|\.\d[\d_]*)(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? diff --git a/generated/syntax/slua.tmLanguage.json b/generated/syntax/slua.tmLanguage.json index a8c3e62f..21d67a2b 100644 --- a/generated/syntax/slua.tmLanguage.json +++ b/generated/syntax/slua.tmLanguage.json @@ -275,15 +275,15 @@ "patterns": [ { "name": "constant.numeric.hex.luau", - "match": "\\b0_*[xX]_*[\\da-fA-F_]*(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "\\b0_*[xX]_*[\\da-fA-F_]*(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" }, { "name": "constant.numeric.binary.luau", - "match": "\\b0_*[bB][01_]+(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "\\b0_*[bB][01_]+(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" }, { "name": "constant.numeric.decimal.luau", - "match": "(?:\\d[\\d_]*(?:\\.[\\d_]*)?|\\.\\d[\\d_]*)(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "(?:\\d[\\d_]*(?:\\.[\\d_]*)?|\\.\\d[\\d_]*)(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" } ] }, diff --git a/lsl_definitions/generators/keywords.py b/lsl_definitions/generators/keywords.py index 3feca03d..0982a43c 100644 --- a/lsl_definitions/generators/keywords.py +++ b/lsl_definitions/generators/keywords.py @@ -64,8 +64,16 @@ def dump_slua_syntax( header_comment = b"""""" syntax = { - "controls": slua_definitions.controls.copy(), - "types": slua_definitions.builtin_types.copy(), + "controls": { + k: v + for k, v in slua_definitions.controls.items() + if not v.get("typechecker", {}).get("fflag-disabled", False) + }, + "types": { + k: v + for k, v in slua_definitions.builtin_types.items() + if not v.get("typechecker", {}).get("fflag-disabled", False) + }, "constants": {}, "events": {}, "functions": {}, diff --git a/lsl_definitions/generators/slua.py b/lsl_definitions/generators/slua.py index eff18ccd..3aaa3b88 100644 --- a/lsl_definitions/generators/slua.py +++ b/lsl_definitions/generators/slua.py @@ -52,13 +52,13 @@ def gen_luau_lsp_defs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit class_.write_luau_def(defs) defs.write("\n") for func in slua_definitions.functions: - if func.private or func.local_only: + if not func.show_in_syntax_files: continue if not func.typechecker_flags.fully_defined: defs.write("-- ") func.write_luau_global_def(defs) for module in sorted(slua_definitions.modules, key=lambda x: x.name): - if module.name in {"ll", "llcompat"}: + if module.name in {"ll", "llcompat"} or module.typechecker_flags.fflag_disabled: continue if module.name == "string": defs.write( @@ -196,6 +196,8 @@ def selene_class(class_: SLuaClassDeclaration) -> dict: def selene_module(module: SLuaModule) -> dict: globals = {} + if module.typechecker_flags.fflag_disabled: + return globals if module.callable: globals[module.name] = selene_function(module.callable) globals.update( @@ -211,7 +213,7 @@ def selene_module(module: SLuaModule) -> dict: f"{module.name}.{func.name}": selene_function(func) # for func in sorted(self.functions, key=lambda x: x.name) for func in module.functions - if not func.private and not func.local_only + if func.show_in_syntax_files } ) return globals @@ -234,7 +236,7 @@ def selene_module(module: SLuaModule) -> dict: if not const.private: selene["globals"][const.name] = selene_property(const) for func in sorted(slua_definitions.functions, key=lambda x: x.name): - if not func.private and not func.local_only: + if func.show_in_syntax_files: selene["globals"][func.name] = selene_function(func) for module in sorted(modules.values(), key=lambda x: x.name): if module.name not in {"ll", "llcompat"}: diff --git a/lsl_definitions/generators/slua_lsp_docs.py b/lsl_definitions/generators/slua_lsp_docs.py index f0d9a6f9..f05badd2 100644 --- a/lsl_definitions/generators/slua_lsp_docs.py +++ b/lsl_definitions/generators/slua_lsp_docs.py @@ -82,6 +82,8 @@ def add_constant(self, const: SLuaProperty, module: str | None = None): self.docs[f"{GLOBALS_PREFIX}{module_prefix}{const.name}"] = entry def add_module(self, module: SLuaModule) -> None: + if module.typechecker_flags.fflag_disabled: + return if module.callable: self.add_function(module.callable) else: @@ -95,7 +97,7 @@ def add_module(self, module: SLuaModule) -> None: self.add_constant(const, module=module.name) # for func in sorted(self.functions, key=lambda x: x.name) for func in module.functions: - if not func.private and not func.local_only: + if func.show_in_syntax_files: self.add_function(func, module=module.name) @@ -120,7 +122,7 @@ def gen_slua_lsp_docs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit # if not const.private and const.name != "rotation": # selene["globals"][const.name] = selene_property(const) for func in slua_definitions.functions: - if not func.private and not func.local_only and not func.slua_removed: + if func.show_in_syntax_files and not func.slua_removed: builder.add_function(func) for module in sorted(modules.values(), key=lambda x: x.name): if module.name not in {"ll", "llcompat"}: diff --git a/lsl_definitions/generators/textmate.py b/lsl_definitions/generators/textmate.py index cceb93a0..766d2066 100644 --- a/lsl_definitions/generators/textmate.py +++ b/lsl_definitions/generators/textmate.py @@ -103,14 +103,18 @@ def get_slua_global_constants_for_module(module: SLuaModule) -> str: return f"{module.name}{constants}" def get_slua_global_constants(definitions: SLuaDefinitions) -> str: - constants = [get_slua_global_constants_for_module(m) for m in definitions.modules] + constants = [ + get_slua_global_constants_for_module(m) + for m in definitions.modules + if not m.typechecker_flags.fflag_disabled + ] constants.sort() return "|".join(constants) def get_slua_module_regex(module: SLuaModule) -> str: if module.name in {"ll", "llcompat"}: return None - functions = [f.name for f in module.functions if not f.private and not f.local_only] + functions = [f.name for f in module.functions if f.show_in_syntax_files] functions.sort() functions = "|".join(functions) if len(functions) < 1: @@ -122,7 +126,11 @@ def get_LL_constants(slua_definitions: SLuaDefinitions) -> str: return crunch_regex_strings(constants) def get_slua_modules(definitions: SLuaDefinitions) -> str: - modules = [get_slua_module_regex(m) for m in definitions.modules] + modules = [ + get_slua_module_regex(m) + for m in definitions.modules + if not m.typechecker_flags.fflag_disabled + ] modules = [m for m in modules if m is not None] modules.sort() return "|".join(modules) @@ -131,7 +139,7 @@ def get_LL_module_functions(definitions: SLuaDefinitions) -> str: functions = [ f.name for f in definitions.get_module("ll").functions - if not f.private and not f.local_only and not f.slua_removed and f.deprecated is None + if f.show_in_syntax_files and not f.slua_removed and f.deprecated is None ] return crunch_regex_strings(functions) @@ -139,17 +147,18 @@ def get_LL_module_deprecated_functions(definitions: SLuaDefinitions) -> str: functions = [ f.name for f in definitions.get_module("ll").functions - if not f.private - and not f.local_only - and not f.slua_removed - and f.deprecated is not None + if f.show_in_syntax_files and not f.slua_removed and f.deprecated is not None ] return crunch_regex_strings(functions) def get_slua_global_types(definitions: SLuaDefinitions) -> str: # Missing types that are not documented in builtins, classes or aliases missing_types = ["nil"] - builtin_types = [t for t in definitions.builtin_types.keys()] + builtin_types = [ + t + for t in definitions.builtin_types.keys() + if not definitions.builtin_types[t].get("typechecker", {}).get("fflag-disabled", False) + ] base_classes = [b.name for b in definitions.base_classes] type_aliases = [t.name for t in definitions.type_aliases if t.export] return "|".join(missing_types + builtin_types + base_classes + type_aliases) diff --git a/lsl_definitions/slua.py b/lsl_definitions/slua.py index 50073cab..c42d114a 100644 --- a/lsl_definitions/slua.py +++ b/lsl_definitions/slua.py @@ -124,6 +124,8 @@ class SLuaTypecheckerFlags: """ checked: bool = False """Raises an error if types are incorrect. Causes !nonstrict to behave like !strict.""" + fflag_disabled: bool = False + """This function is present in Luau, but is temporarily disabled by a feature flag in SLua. Exclude it from syntax files.""" @property def fully_defined(self) -> bool: @@ -139,6 +141,15 @@ def comment_string(self) -> str: comments.append("magic type") return " -- " + ", ".join(comments) if comments else "" + @classmethod + def from_dict(cls, d: dict) -> SLuaTypecheckerFlags: + return cls( + builtin=d.get("builtin", False), + magic=d.get("magic", False), + checked=d.get("checked", False), + fflag_disabled=d.get("fflag-disabled", False), + ) + @dataclasses.dataclass class SLuaFunctionBase(abc.ABC): @@ -185,6 +196,12 @@ class SLuaFunction(SLuaFunctionBase): """Flags specific to the internals of luau-analyze and luau-lsp.""" overloads: list[SLuaFunctionOverload] = dataclasses.field(default_factory=list) + @property + def show_in_syntax_files(self) -> bool: + return ( + not self.private and not self.local_only and not self.typechecker_flags.fflag_disabled + ) + @property def annotation_string(self) -> str: annotation = "" @@ -353,9 +370,15 @@ class SLuaModule: constants: list[SLuaProperty] functions: list[SLuaFunction] comment: str = "" + typechecker_flags: SLuaTypecheckerFlags = dataclasses.field( + default_factory=SLuaTypecheckerFlags + ) + """Flags specific to the internals of luau-analyze and luau-lsp.""" def to_keywords_functions_dict(self) -> dict: functions = {} + if self.typechecker_flags.fflag_disabled: + return functions if self.callable: functions[self.name] = self.callable.to_keywords_dict() else: @@ -364,12 +387,14 @@ def to_keywords_functions_dict(self) -> dict: { f"{self.name}.{func.name}": func.to_keywords_dict() for func in sorted(self.functions, key=lambda x: x.name) - if not func.private and not func.local_only + if func.show_in_syntax_files } ) return functions def to_keywords_constants_dict(self) -> dict: + if self.typechecker_flags.fflag_disabled: + return {} return { f"{self.name}.{prop.name}": prop.to_keywords_dict() for prop in sorted(self.constants, key=lambda x: x.name) @@ -403,7 +428,7 @@ def write_luau_def(self, f: TextIO) -> None: for prop in self.constants: f.write(f" {prop.to_luau_def()},\n") for func in self.functions: - if func.private or func.local_only: + if not func.show_in_syntax_files: continue func.write_luau_table_def(f, indent=1) f.write("}\n\n") @@ -872,6 +897,7 @@ def _validate_module(self, data: dict) -> SLuaModule: callable=None, constants=[], functions=[], + typechecker_flags=SLuaTypecheckerFlags.from_dict(data.get("typechecker", {})), ) try: self._validate_identifier(module.name) @@ -947,7 +973,7 @@ def _validate_function( local_only=data.get("local-only", False), slua_removed=data.get("slua-removed", False), must_use=data.get("must-use", False), - typechecker_flags=SLuaTypecheckerFlags(**data.get("typechecker", {})), + typechecker_flags=SLuaTypecheckerFlags.from_dict(data.get("typechecker", {})), ) self._validate_identifier(func.name) self._validate_scope(func.name, scope) diff --git a/slua_definitions.yaml b/slua_definitions.yaml index 1c618e0b..7141dadf 100644 --- a/slua_definitions.yaml +++ b/slua_definitions.yaml @@ -1051,6 +1051,19 @@ modules: must-use: true fastcall: true typechecker: {checked: true} + - name: readinteger + comment: Reads a signed or unsigned 64-bit integer from the buffer at the given offset. + parameters: + - name: b + comment: Buffer to read from. + type: buffer + - name: offset + comment: Byte offset to read from. + type: number + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true, fflag-disabled: true} - name: readu32 comment: Reads an unsigned 32-bit integer from the buffer at the given offset. parameters: @@ -1170,6 +1183,22 @@ modules: return-type: () fastcall: true typechecker: {checked: true} + - name: writeinteger + comment: Writes a signed or unsigned 64-bit integer to the buffer at the given offset. + parameters: + - name: b + comment: Buffer to write to. + type: buffer + observes: write + - name: offset + comment: Byte offset to write at. + type: number + - name: value + comment: Value to write. + type: integer + return-type: () + fastcall: true + typechecker: {checked: true, fflag-disabled: true} - name: writeu32 comment: Writes an unsigned 32-bit integer to the buffer at the given offset. parameters: @@ -1336,6 +1365,31 @@ modules: type: number return-type: () typechecker: {checked: true} +- name: class + comment: Class/object manipulation library. + typechecker: {fflag-disabled: true} + functions: + - name: classof + comment: Returns the class of the given object, or nil if not a class. + parameters: + - name: obj + comment: Object to get the class of. + type: unknown + return-type: class? + must-use: true + typechecker: {checked: true} + - name: instanceof + comment: Returns true if obj is an instance of the given class. + parameters: + - name: obj + comment: Object to check the class of. + type: unknown + - name: cls + comment: Class to check against. + type: class + return-type: boolean + must-use: true + typechecker: {checked: true} - name: coroutine comment: Coroutine manipulation library. functions: @@ -1465,6 +1519,518 @@ modules: default-value: 1 return-type: string must-use: true +- name: integer + comment: 64-bit integer operations library. + typechecker: {fflag-disabled: true} + functions: + - name: add + comment: Returns the sum of two 64-bit integers (signed or unsigned), wrapping on overflow. + parameters: + - name: int1 + comment: Left integer addend. + type: integer + - name: int2 + comment: Right integer addend. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: arshift + comment: |- + Returns val shifted by i bits to the right. If i is negative, a left shift is performed. + Does an arithmetic shift: The most significant bit of n is propagated during the shift. + parameters: + - name: val + comment: Integer to shift. + type: integer + - name: i + comment: Number of bits to shift. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: band + comment: Returns the bitwise AND of the given integers. + parameters: + - name: ... + comment: Integers to perform bitwise AND on. + type: ...integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: bnot + comment: Returns the bitwise negation of val. + parameters: + - name: val + comment: Integer to negate. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: bor + comment: Returns the bitwise OR of the given integers. + parameters: + - name: ... + comment: Integers to perform bitwise OR on. + type: ...integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: bxor + comment: Returns the bitwise XOR of the given integers. + parameters: + - name: ... + comment: Integers to perform bitwise XOR on. + type: ...integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: bswap + comment: Returns val with its bytes swapped to the reverse order. + parameters: + - name: val + comment: Integer whose byte order will be swapped. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: btest + comment: Returns true if the bitwise AND of the given integers is non-zero. + parameters: + - name: ... + comment: Integers to perform bitwise AND on. + type: ...integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: clamp + comment: Returns val clamped between min and max. Raises an error if min is greater than max. + parameters: + - name: val + comment: Integer to clamp. + type: integer + - name: min + comment: Minimum allowable integer. + type: integer + - name: max + comment: Maximum allowable integer. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: countlz + comment: Returns the count of val's leading zeros. + parameters: + - name: val + comment: Integer to count leading zeros in. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: countrz + comment: Returns the count of val's troiling zeros. + parameters: + - name: val + comment: Integer to count trailing zeros in. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: create + comment: Returns number val converted to an integer. Returns nil if + it has a fractional part, is out of range, or is NaN. + parameters: + - name: val + comment: Number to convert to an integer. + type: number + return-type: integer? + must-use: true + fastcall: true + typechecker: {checked: true} + - name: div + comment: Returns dividend / divisor (signed), rounding toward zero. Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: extract + comment: Returns width bits from src, starting from bit index field. + Raises an error if the selected bit range is goes outside the range [0, 63]. + parameters: + - name: src + comment: Integer to extract from. + type: integer + - name: field + comment: Starting bit index, zero-based + type: integer + - name: width + comment: Number of bits to extract, or 1 if omitted. + type: integer? + default-value: 1 + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: fromstring + comment: Converts the input string to an integer in the specified base. Returns nil if not an integer. + parameters: + - name: value + comment: String to convert to an integer. + type: string + - name: base + comment: Base for the conversion. + type: number? + default-value: 10 + return-type: integer? + must-use: true + - name: ge + comment: Returns true if int1 >= int2 (signed). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: gt + comment: Returns true if int1 > int2 (signed). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: idiv + comment: Returns dividend / divisor (signed), rounding toward negative infinity. Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: le + comment: Returns true if int1 <= int2 (signed). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: lt + comment: Returns true if int1 < int2 (signed). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: lrotate + comment: Returns val rotated by i bits to the left. If i is negative, a right rotate is performed. + parameters: + - name: val + comment: Integer to rotate. + type: integer + - name: i + comment: Number of bits to rotate. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: lshift + comment: Returns val shifted by i bits to the left. If i is negative, a right shift is performed. Returns 0 if i is outside the [-63, 63] range. + parameters: + - name: val + comment: Integer to shift. + type: integer + - name: i + comment: Number of bits to shift. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: max + comment: Returns the maximum value from the given integers (signed). + parameters: + - name: val + comment: Integer to find the maximum from. + type: integer + - name: ... + comment: Integers to find the maximum from. + type: ...integer + optional: false + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: min + comment: Returns the minimum value from the given integers (signed). + parameters: + - name: val + comment: Integer to find the minimum from. + type: integer + - name: ... + comment: Integers to find the minimum from. + type: ...integer + optional: false + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: mod + comment: Returns the remainder of dividend / divisor (signed). + The result always has the same sign as the divisor. + Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: mul + comment: Returns the product of two 64-bit integers (signed or unsigned), wrapping on overflow. + parameters: + - name: int1 + comment: Left integer factor. + type: integer + - name: int2 + comment: Right integer factor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: neg + comment: Returns the negation of val. + integer.neg(integer.minsigned) == integer.minsigned due to overflow. + parameters: + - name: val + comment: Integer to negate. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: rem + comment: Returns the remainder of dividend / divisor (signed). + The result always has the same sign as the dividend. + Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: replace + comment: Returns dst with width bits replaced from src, starting from bit index field. + Raises an error if the selected bit range goes outside the range [0, 63]. + parameters: + - name: dst + comment: Integer to replace bits in. + type: integer + - name: src + comment: Integer containing the replacement bits. + type: integer + - name: field + comment: Starting bit index, zero-based + type: integer + - name: width + comment: Number of bits to replace, or 1 if omitted. + type: integer? + default-value: 1 + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: rrotate + comment: Returns val rotated by i bits to the right. If i is negative, a left rotate is performed. + parameters: + - name: val + comment: Integer to rotate. + type: integer + - name: i + comment: Number of bits to rotate. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: rshift + comment: Returns val shifted by i bits to the right. If i is negative, a left shift is performed. Returns 0 if i is outside the [-63, 63] range. + parameters: + - name: val + comment: Integer to shift. + type: integer + - name: i + comment: Number of bits to shift. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: sub + comment: Returns the difference between two 64-bit integers (signed or unsigned), wrapping on overflow. + parameters: + - name: int1 + comment: Integer to subtract from. + type: integer + - name: int2 + comment: Integer to subtract. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: tonumber + comment: Returns the nearest float64 to the given int64. Is inexact above 2^53. + parameters: + - name: val + comment: Integer to convert to a number. + type: integer + return-type: number + fastcall: true + must-use: true + - name: udiv + comment: Returns dividend / divisor (unsigned), rounding toward negative infinity. Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + - name: uge + comment: Returns true if int1 >= int2 (unsigned). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: ugt + comment: Returns true if int1 > int2 (unsigned). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: ule + comment: Returns true if int1 <= int2 (unsigned). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: ult + comment: Returns true if int1 < int2 (unsigned). + parameters: + - name: int1 + comment: Left integer to compare. + type: integer + - name: int2 + comment: Right integer to compare. + type: integer + return-type: boolean + must-use: true + fastcall: true + typechecker: {checked: true} + - name: urem + comment: Returns the remainder of dividend / divisor (unsigned). + Raises an error if divisor is zero. + parameters: + - name: dividend + comment: Integer dividend. + type: integer + - name: divisor + comment: Integer divisor. + type: integer + return-type: integer + must-use: true + fastcall: true + typechecker: {checked: true} + constants: + - name: maxsigned + comment: The most positive signed int64 (2^63-1). + type: integer + value: 9_223_372_036_854_775_807i + - name: minsigned + comment: The most negative signed int64 (-2^63). + type: integer + value: -9_223_372_036_854_775_808i - name: llbase64 comment: Base64 encoding/decoding library. functions: @@ -3134,6 +3700,9 @@ controls: tooltip: "Lua local keyword: declares a local variable or function." export: tooltip: "Luau export keyword: declares a type that can be used outside this module." + public: + tooltip: "Luau public keyword: declares a class attribute." + typechecker: {fflag-disabled: true} in: tooltip: "Lua in keyword: used in generic for loops to iterate over elements." not: @@ -3149,10 +3718,19 @@ builtin-types: tooltip: "Boolean: represents a true or false value." buffer: tooltip: Read-write binary data. + class: + tooltip: Shared methods and attributes available to object instances. + typechecker: {fflag-disabled: true} + integer: + tooltip: 64-bit integer. + typechecker: {fflag-disabled: true} never: tooltip: The empty type that contains no values. number: - tooltip: Double‑precision floating point number. + tooltip: Double‑precision (64-bit) floating point number. + object: + tooltip: Instance of a class. + typechecker: {fflag-disabled: true} string: tooltip: Read-only binary data. Usually UTF-8-encoded text. thread: diff --git a/templates/syntax/slua.tmLanguage b/templates/syntax/slua.tmLanguage index 6064f30f..598c665e 100644 --- a/templates/syntax/slua.tmLanguage +++ b/templates/syntax/slua.tmLanguage @@ -488,19 +488,19 @@ name constant.numeric.hex.luau match - \b0_*[xX]_*[\da-fA-F_]*(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + \b0_*[xX]_*[\da-fA-F_]*(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? name constant.numeric.binary.luau match - \b0_*[bB][01_]+(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + \b0_*[bB][01_]+(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? name constant.numeric.decimal.luau match - (?:\d[\d_]*(?:\.[\d_]*)?|\.\d[\d_]*)(?:[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? + (?:\d[\d_]*(?:\.[\d_]*)?|\.\d[\d_]*)(?:i|[eE][\+\-]?_*\d[\d_]*(?:\.[\d_]*)?)? diff --git a/templates/syntax/slua.tmLanguage.json b/templates/syntax/slua.tmLanguage.json index 7fa4253a..736a1b50 100644 --- a/templates/syntax/slua.tmLanguage.json +++ b/templates/syntax/slua.tmLanguage.json @@ -275,15 +275,15 @@ "patterns": [ { "name": "constant.numeric.hex.luau", - "match": "\\b0_*[xX]_*[\\da-fA-F_]*(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "\\b0_*[xX]_*[\\da-fA-F_]*(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" }, { "name": "constant.numeric.binary.luau", - "match": "\\b0_*[bB][01_]+(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "\\b0_*[bB][01_]+(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" }, { "name": "constant.numeric.decimal.luau", - "match": "(?:\\d[\\d_]*(?:\\.[\\d_]*)?|\\.\\d[\\d_]*)(?:[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" + "match": "(?:\\d[\\d_]*(?:\\.[\\d_]*)?|\\.\\d[\\d_]*)(?:i|[eE][\\+\\-]?_*\\d[\\d_]*(?:\\.[\\d_]*)?)?" } ] },