diff --git a/CHANGELOG.md b/CHANGELOG.md index f0a9da5d6..be679a5a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -146,6 +146,20 @@ ([Giacomo Cavalieri](https://github.com/giacomocavalieri)) +- The language server now offers a code action to rewrite integers in a + different base. For example: + + ```gleam + pub fn lucky_number() { + 0b1011 + //^^^^^^ Hovering this + } + ``` + + The language server is going to show code actions to rewrite it as `11`, + `0o13`, or `0xB`. + ([Giacomo Cavalieri](https://github.com/giacomocavalieri)) + - The "remove unreachable patterns" code action can now be triggered on unreachable alternative patterns of a case expression. ([Giacomo Cavalieri](https://github.com/giacomocavalieri)) diff --git a/Cargo.lock b/Cargo.lock index c6824f3ea..51733a6ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1316,6 +1316,7 @@ dependencies = [ "insta", "itertools", "lsp-server", + "num-bigint", "serde", "serde_json", "strum", diff --git a/compiler-core/src/ast/visit.rs b/compiler-core/src/ast/visit.rs index 3be57ad52..362ab6827 100644 --- a/compiler-core/src/ast/visit.rs +++ b/compiler-core/src/ast/visit.rs @@ -114,9 +114,10 @@ pub trait Visit<'ast> { &mut self, location: &'ast SrcSpan, type_: &'ast Arc, - value: &'ast EcoString, + string_value: &'ast EcoString, + int_value: &'ast BigInt, ) { - visit_typed_expr_int(self, location, type_, value); + visit_typed_expr_int(self, location, type_, string_value, int_value); } fn visit_typed_expr_float( @@ -1261,8 +1262,8 @@ where location, type_, value, - int_value: _, - } => v.visit_typed_expr_int(location, type_, value), + int_value, + } => v.visit_typed_expr_int(location, type_, value, int_value), TypedExpr::Float { location, type_, @@ -1428,7 +1429,8 @@ pub fn visit_typed_expr_int<'a, V>( _v: &mut V, _location: &'a SrcSpan, _type_: &'a Arc, - _value: &'a EcoString, + _string_value: &'a EcoString, + _int_value: &'a BigInt, ) where V: Visit<'a> + ?Sized, { diff --git a/language-server/Cargo.toml b/language-server/Cargo.toml index b4693f069..401121bdd 100644 --- a/language-server/Cargo.toml +++ b/language-server/Cargo.toml @@ -26,6 +26,7 @@ vec1.workspace = true serde.workspace = true tracing.workspace = true toml.workspace = true +num-bigint.workspace = true [dev-dependencies] insta.workspace = true diff --git a/language-server/src/code_action.rs b/language-server/src/code_action.rs index 5138f034f..b05e1f2f3 100644 --- a/language-server/src/code_action.rs +++ b/language-server/src/code_action.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 The Gleam contributors -use std::{collections::HashSet, iter, sync::Arc}; +use std::{collections::HashSet, iter, ops::Neg, sync::Arc}; use ecow::{EcoString, eco_format}; use gleam_core::{ @@ -36,6 +36,7 @@ use lsp_types::{ CodeAction, CodeActionKind, CodeActionParams, CreateFile, CreateFileOptions, DocumentChange, Position, Range, TextEdit, Uri as Url, }; +use num_bigint::BigInt; use vec1::{Vec1, vec1}; use crate::engine::{completely_within, position_within}; @@ -13099,3 +13100,123 @@ impl<'a> ConvertBetweenDocAndRegularComment<'a> { }) } } + +/// Code action to convert integers to a different base from the current one. +/// +pub struct ConvertIntToDifferentBase<'a> { + module: &'a Module, + params: &'a CodeActionParams, + edits: TextEdits<'a>, + /// This is gonna hold the base the hovered integer is written in, and its + /// decimal value. And its position in the source code. + int: Option<(SrcSpan, Base, BigInt)>, +} + +enum Base { + Binary, + Octal, + Decimal, + Hexadecimal, +} + +impl<'a> ConvertIntToDifferentBase<'a> { + pub fn new( + module: &'a Module, + line_numbers: &'a LineNumbers, + params: &'a CodeActionParams, + ) -> Self { + Self { + module, + params, + edits: TextEdits::new(line_numbers), + int: None, + } + } + + pub fn code_actions(mut self) -> Vec { + self.visit_typed_module(&self.module.ast); + + let Some((location, base, int)) = self.int else { + return vec![]; + }; + + let missing_bases = match base { + Base::Binary => [Base::Decimal, Base::Octal, Base::Hexadecimal], + Base::Octal => [Base::Decimal, Base::Binary, Base::Hexadecimal], + Base::Decimal => [Base::Binary, Base::Octal, Base::Hexadecimal], + Base::Hexadecimal => [Base::Decimal, Base::Binary, Base::Octal], + }; + + let is_negative = int < BigInt::ZERO; + let int = if is_negative { int.neg() } else { int }; + + let mut action = Vec::with_capacity(3); + for base in missing_bases { + let minus = if is_negative { "-" } else { "" }; + let converted_number = match base { + Base::Binary => format!("{minus}0b{:b}", int), + Base::Octal => format!("{minus}0o{:o}", int), + Base::Decimal => format!("{minus}{}", int), + Base::Hexadecimal => format!("{minus}0x{:x}", int), + }; + let title = format!("Convert to `{converted_number}`"); + self.edits.replace(location, converted_number); + + CodeActionBuilder::new(&title) + .kind(CodeActionKind::RefactorRewrite) + .changes( + self.params.text_document.uri.clone(), + self.edits.edits.drain(..).collect(), + ) + .preferred(false) + .push_to(&mut action); + } + action + } +} + +impl<'ast> ast::visit::Visit<'ast> for ConvertIntToDifferentBase<'ast> { + fn visit_typed_function(&mut self, fun: &'ast TypedFunction) { + // We skip all the functions the cursor is not inside of. + // This is gonna make it faster to find the int we're hovering, if any. + let fun_range = self.edits.src_span_to_lsp_range(fun.full_location()); + if within(self.params.range, fun_range) { + ast::visit::visit_typed_function(self, fun); + } + } + + fn visit_typed_expr(&mut self, expr: &'ast TypedExpr) { + // We skip all the expression's the cursor is not inside of. + // This is gonna make it faster to find the int we're hovering, if any. + let expression_range = self.edits.src_span_to_lsp_range(expr.location()); + if within(self.params.range, expression_range) { + ast::visit::visit_typed_expr(self, expr); + } + } + + fn visit_typed_expr_int( + &mut self, + location: &'ast SrcSpan, + _type_: &'ast Arc, + string_value: &'ast EcoString, + int_value: &'ast BigInt, + ) { + let int_range = self.edits.src_span_to_lsp_range(*location); + if !within(self.params.range, int_range) { + return; + } + + let string_value = string_value.trim_start_matches('-'); + let base = if string_value.starts_with("0b") { + Base::Binary + } else if string_value.starts_with("0o") { + Base::Octal + } else if string_value.starts_with("0x") { + Base::Hexadecimal + } else { + Base::Decimal + }; + + self.int = Some((*location, base, int_value.clone())) + } +} diff --git a/language-server/src/engine.rs b/language-server/src/engine.rs index 6189958d6..2de144fc5 100644 --- a/language-server/src/engine.rs +++ b/language-server/src/engine.rs @@ -40,8 +40,8 @@ use std::{ use crate::{ code_action::{ - DiscardUnusedVariable, RemoveRedundantRecordUpdate, ReplaceUnderscoreWithType, - code_action_fix_deprecated_pipe, type_errors_for_module, + ConvertIntToDifferentBase, DiscardUnusedVariable, RemoveRedundantRecordUpdate, + ReplaceUnderscoreWithType, code_action_fix_deprecated_pipe, type_errors_for_module, }, reference::find_module_references_in_module, rename::{rename_module_alias, rename_module_occurrences, rename_type_variable}, @@ -559,6 +559,7 @@ where actions.extend( ConvertBetweenDocAndRegularComment::new(module, &lines, ¶ms).code_actions(), ); + actions.extend(ConvertIntToDifferentBase::new(module, &lines, ¶ms).code_actions()); actions.sort_by_key(|one| { let preferred_key = if one.is_preferred == Some(true) { 0 } else { 1 }; diff --git a/language-server/src/tests/action.rs b/language-server/src/tests/action.rs index c8765342f..56c731f04 100644 --- a/language-server/src/tests/action.rs +++ b/language-server/src/tests/action.rs @@ -15602,3 +15602,218 @@ fn convert_to_regular_comment_no_affect_other_comment() { find_position_of("wibble").to_selection() ); } + +#[test] +fn convert_int_decimal_to_binary() { + assert_code_action!( + "Convert to `0b1101111`", + "pub fn main() { 111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_int_decimal_to_octal() { + assert_code_action!( + "Convert to `0o157`", + "pub fn main() { 111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_int_decimal_to_hexadecimal() { + assert_code_action!( + "Convert to `0x6f`", + "pub fn main() { 111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_int_binary_to_octal() { + assert_code_action!( + "Convert to `0o157`", + "pub fn main() { 0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_int_binary_to_decimal() { + assert_code_action!( + "Convert to `111`", + "pub fn main() { 0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_int_binary_to_hexadecimal() { + assert_code_action!( + "Convert to `0x6f`", + "pub fn main() { 0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_int_octal_to_binary() { + assert_code_action!( + "Convert to `0b1101111`", + "pub fn main() { 0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_int_octal_to_decimal() { + assert_code_action!( + "Convert to `111`", + "pub fn main() { 0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_int_octal_to_hexadecimal() { + assert_code_action!( + "Convert to `0x6f`", + "pub fn main() { 0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_int_hexadecimal_to_binary() { + assert_code_action!( + "Convert to `0b1101111`", + "pub fn main() { 0x6f }", + find_position_of("0x6f").to_selection() + ); +} + +#[test] +fn convert_int_hexadecimal_to_octal() { + assert_code_action!( + "Convert to `0o157`", + "pub fn main() { 0x6f }", + find_position_of("0x6f").to_selection() + ); +} + +#[test] +fn convert_int_hexadecimal_to_decimal() { + assert_code_action!( + "Convert to `111`", + "pub fn main() { 0x6f }", + find_position_of("0x6f").to_selection() + ); +} +#[test] +fn convert_negative_int_decimal_to_binary() { + assert_code_action!( + "Convert to `-0b1101111`", + "pub fn main() { -111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_negative_int_decimal_to_octal() { + assert_code_action!( + "Convert to `-0o157`", + "pub fn main() { -111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_negative_int_decimal_to_hexadecimal() { + assert_code_action!( + "Convert to `-0x6f`", + "pub fn main() { -111 }", + find_position_of("111").to_selection() + ); +} + +#[test] +fn convert_negative_int_binary_to_octal() { + assert_code_action!( + "Convert to `-0o157`", + "pub fn main() { -0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_negative_int_binary_to_decimal() { + assert_code_action!( + "Convert to `-111`", + "pub fn main() { -0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_negative_int_binary_to_hexadecimal() { + assert_code_action!( + "Convert to `-0x6f`", + "pub fn main() { -0b1101111 }", + find_position_of("0b1101111").to_selection() + ); +} + +#[test] +fn convert_negative_int_octal_to_binary() { + assert_code_action!( + "Convert to `-0b1101111`", + "pub fn main() { -0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_negative_int_octal_to_decimal() { + assert_code_action!( + "Convert to `-111`", + "pub fn main() { -0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_negative_int_octal_to_hexadecimal() { + assert_code_action!( + "Convert to `-0x6f`", + "pub fn main() { -0o157 }", + find_position_of("0o157").to_selection() + ); +} + +#[test] +fn convert_negative_int_hexadecimal_to_binary() { + assert_code_action!( + "Convert to `-0b1101111`", + "pub fn main() { -0x6f }", + find_position_of("0x6f").to_selection() + ); +} + +#[test] +fn convert_negative_int_hexadecimal_to_octal() { + assert_code_action!( + "Convert to `-0o157`", + "pub fn main() { -0x6f }", + find_position_of("0x6f").to_selection() + ); +} + +#[test] +fn convert_negative_int_hexadecimal_to_decimal() { + assert_code_action!( + "Convert to `-111`", + "pub fn main() { -0x6f }", + find_position_of("0x6f").to_selection() + ); +} diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_decimal.snap new file mode 100644 index 000000000..4a0de8922 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { 0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_hexadecimal.snap new file mode 100644 index 000000000..4d4fb0b5f --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { 0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0x6f } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_octal.snap new file mode 100644 index 000000000..c56c5b0df --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_binary_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { 0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_binary.snap new file mode 100644 index 000000000..68ad2700f --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 111 }" +--- +----- BEFORE ACTION +pub fn main() { 111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_hexadecimal.snap new file mode 100644 index 000000000..0cac880a5 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 111 }" +--- +----- BEFORE ACTION +pub fn main() { 111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0x6f } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_octal.snap new file mode 100644 index 000000000..a78f9500c --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_decimal_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 111 }" +--- +----- BEFORE ACTION +pub fn main() { 111 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_binary.snap new file mode 100644 index 000000000..920dfae13 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0x6f }" +--- +----- BEFORE ACTION +pub fn main() { 0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { 0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_decimal.snap new file mode 100644 index 000000000..2de247861 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0x6f }" +--- +----- BEFORE ACTION +pub fn main() { 0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { 111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_octal.snap new file mode 100644 index 000000000..163d12c87 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_hexadecimal_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0x6f }" +--- +----- BEFORE ACTION +pub fn main() { 0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { 0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_binary.snap new file mode 100644 index 000000000..b222e4aed --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0o157 }" +--- +----- BEFORE ACTION +pub fn main() { 0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_decimal.snap new file mode 100644 index 000000000..922b0c0e4 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0o157 }" +--- +----- BEFORE ACTION +pub fn main() { 0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { 111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_hexadecimal.snap new file mode 100644 index 000000000..1ee93b2ed --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_int_octal_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { 0o157 }" +--- +----- BEFORE ACTION +pub fn main() { 0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { 0x6f } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_decimal.snap new file mode 100644 index 000000000..8caac1173 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { -0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_hexadecimal.snap new file mode 100644 index 000000000..daf81c10e --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { -0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0x6f } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_octal.snap new file mode 100644 index 000000000..b56a29531 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_binary_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0b1101111 }" +--- +----- BEFORE ACTION +pub fn main() { -0b1101111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_binary.snap new file mode 100644 index 000000000..237e4189c --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -111 }" +--- +----- BEFORE ACTION +pub fn main() { -111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_hexadecimal.snap new file mode 100644 index 000000000..2e7d1f03a --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -111 }" +--- +----- BEFORE ACTION +pub fn main() { -111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0x6f } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_octal.snap new file mode 100644 index 000000000..94922640f --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_decimal_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -111 }" +--- +----- BEFORE ACTION +pub fn main() { -111 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_binary.snap new file mode 100644 index 000000000..5ff16c5fe --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0x6f }" +--- +----- BEFORE ACTION +pub fn main() { -0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { -0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_decimal.snap new file mode 100644 index 000000000..d7dac7011 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0x6f }" +--- +----- BEFORE ACTION +pub fn main() { -0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { -111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_octal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_octal.snap new file mode 100644 index 000000000..2aaae42a4 --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_hexadecimal_to_octal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0x6f }" +--- +----- BEFORE ACTION +pub fn main() { -0x6f } + ↑ + + +----- AFTER ACTION +pub fn main() { -0o157 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_binary.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_binary.snap new file mode 100644 index 000000000..fa95f335d --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_binary.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0o157 }" +--- +----- BEFORE ACTION +pub fn main() { -0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0b1101111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_decimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_decimal.snap new file mode 100644 index 000000000..3ea69cf1d --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_decimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0o157 }" +--- +----- BEFORE ACTION +pub fn main() { -0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { -111 } diff --git a/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_hexadecimal.snap b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_hexadecimal.snap new file mode 100644 index 000000000..08bddaccb --- /dev/null +++ b/language-server/src/tests/snapshots/gleam_language_server__tests__action__convert_negative_int_octal_to_hexadecimal.snap @@ -0,0 +1,11 @@ +--- +source: language-server/src/tests/action.rs +expression: "pub fn main() { -0o157 }" +--- +----- BEFORE ACTION +pub fn main() { -0o157 } + ↑ + + +----- AFTER ACTION +pub fn main() { -0x6f }