2025-08-19 08:06:37 -04:00

210 lines
5.1 KiB
Python

from talon import Context, Module, actions, settings
from ..tags.operators import Operators
ctx = Context()
mod = Module()
ctx.matches = r"""
code.language: scala
"""
# Scala Common Types
scala_common_types = {
"boolean": "Boolean",
"int": "Int",
"float": "Float",
"byte": "Byte",
"double": "Double",
"short": "Short",
"long": "Long",
"char": "Char",
"unit": "Unit",
"any": "Any",
"any val": "AnyVal",
"string": "String",
"thread": "Thread",
"exception": "Exception",
"throwable": "Throwable",
"none": "None",
"success": "Success",
"failure": "Failure",
}
# Scala Common Generic Types
scala_common_generic_types = {
"array": "Array",
"deck": "Deque",
"future": "Future",
"list": "List",
"map": "Map",
"nil": "Nil",
"option": "Option",
"queue": "Queue",
"seek": "Seq",
"set": "Set",
"some": "Some",
"stack": "Stack",
"try": "Try",
}
scala_types = scala_common_types.copy()
scala_types.update(scala_common_generic_types)
ctx.lists["user.code_type"] = scala_types
# Scala Modifies
scala_modifiers = {
"public": "public",
"private": "private",
"protected": "protected",
}
mod.list("scala_modifier", desc="Scala Modifiers")
ctx.lists["user.scala_modifier"] = scala_modifiers
scala_keywords = {
"abstract": "abstract",
"case class": "case class",
"def": "def",
"extends": "extends",
"implicit": "implicit",
"lazy val": "lazy val",
"new": "new",
"object": "object",
"override": "override",
"package": "package",
"sealed": "sealed",
"throw": "throw",
"trait": "trait",
"type": "type",
"val": "val",
"var": "var",
"with": "with",
"yield": "yield",
}
mod.list("scala_keyword", desc="Scala Keywords")
ctx.lists["user.scala_keyword"] = scala_keywords
operators = Operators(
# code_operators_array
SUBSCRIPT=lambda: actions.user.insert_between("(", ")"),
# code_operators_assignment
ASSIGNMENT=" = ",
ASSIGNMENT_ADDITION=" += ",
ASSIGNMENT_SUBTRACTION=" -= ",
ASSIGNMENT_MULTIPLICATION=" *= ",
ASSIGNMENT_DIVISION=" /= ",
ASSIGNMENT_MODULO=" %= ",
ASSIGNMENT_INCREMENT="++",
ASSIGNMENT_BITWISE_AND=" &= ",
ASSIGNMENT_BITWISE_OR=" |= ",
ASSIGNMENT_BITWISE_EXCLUSIVE_OR=" ^= ",
ASSIGNMENT_BITWISE_LEFT_SHIFT=" <<= ",
ASSIGNMENT_BITWISE_RIGHT_SHIFT=" >>= ",
# code_operators_bitwise
BITWISE_NOT="~",
BITWISE_AND=" & ",
BITWISE_OR=" | ",
BITWISE_EXCLUSIVE_OR=" ^ ",
BITWISE_LEFT_SHIFT=" << ",
BITWISE_RIGHT_SHIFT=" >> ",
# code_operators_lambda
LAMBDA=" => ",
# code_operators_math
MATH_ADD=" + ",
MATH_SUBTRACT=" - ",
MATH_MULTIPLY=" * ",
MATH_DIVIDE=" / ",
MATH_MODULO=" % ",
MATH_EQUAL=" == ",
MATH_NOT_EQUAL=" != ",
MATH_NOT="!",
MATH_OR=" || ",
MATH_AND=" && ",
MATH_EXPONENT=" ^ ",
MATH_GREATER_THAN=" > ",
MATH_LESS_THAN=" < ",
MATH_GREATER_THAN_OR_EQUAL=" >= ",
MATH_LESS_THAN_OR_EQUAL=" <= ",
)
@ctx.action_class("user")
class UserActions:
def code_get_operators() -> Operators:
return operators
def code_self():
actions.insert("this")
def code_insert_null():
actions.insert("null")
def code_insert_is_null():
actions.insert(" == null")
def code_insert_is_not_null():
actions.insert(" != null")
def code_insert_true():
actions.insert("true")
def code_insert_false():
actions.insert("false")
def code_comment_block_prefix():
actions.insert("/*")
def code_comment_block_suffix():
actions.insert("*/")
def code_insert_type_annotation(type: str):
actions.insert(f": {type}")
def code_insert_return_type(type: str):
actions.insert(f": {type}")
def code_operator_object_accessor():
actions.insert(".")
def code_default_function(text: str):
"""Inserts function declaration"""
actions.user.code_public_function(text)
def code_insert_function(text: str, selection: str):
if selection:
text = text + f"({selection})"
else:
text = text + "()"
actions.user.paste(text)
actions.edit.left()
def code_private_function(text: str):
"""Inserts private function declaration"""
result = "private def {}".format(
actions.user.formatted_text(
text, settings.get("user.code_private_function_formatter")
)
)
actions.user.code_insert_function(result, None)
def code_protected_function(text: str):
result = "protected def {}".format(
actions.user.formatted_text(
text, settings.get("user.code_protected_function_formatter")
)
)
actions.user.code_insert_function(result, None)
def code_public_function(text: str):
result = "def {}".format(
actions.user.formatted_text(
text, settings.get("user.code_public_function_formatter")
)
)
actions.user.code_insert_function(result, None)