Skip to content
This repository was archived by the owner on May 18, 2026. It is now read-only.

Commit 0ab9b59

Browse files
takaokoujiGemini
andcommitted
fix: correctly convert variable character access to letter_of block
- In variables.js, only handle '[]' if the receiver is a list block. - In operators.js, allow 'variable' type in '[]' handler to convert to 'operator_letter_of'. - This fixes a bug where $my_variable[0] was incorrectly converted to a list item block. Fixes #464 Co-Authored-By: Gemini <noreply@google.com>
1 parent cbb93d7 commit 0ab9b59

3 files changed

Lines changed: 37 additions & 4 deletions

File tree

src/lib/ruby-to-blocks-converter/operators.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const OperatorsConverter = {
1515
return converter._changeBlock(args[0], 'operator_random', 'value');
1616
});
1717

18-
converter.registerOnSend(['string', 'block'], '[]', 1, params => {
18+
converter.registerOnSend(['string', 'block', 'variable'], '[]', 1, params => {
1919
const {receiver, args} = params;
2020
if (!converter._isNumberOrBlock(args[0])) return null;
2121

src/lib/ruby-to-blocks-converter/variables.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,13 @@ const VariablesConverter = {
160160
const {receiver, args} = params;
161161
if (!converter._isNumberOrBlock(args[0])) return null;
162162

163-
const block = converter._changeBlock(receiver, 'data_itemoflist', 'value');
164-
converter._addNumberInput(block, 'INDEX', 'math_integer', args[0], 1);
165-
return block;
163+
if (converter._isBlock(receiver) && converter.isListBlock(receiver)) {
164+
const block = converter._changeBlock(receiver, 'data_itemoflist', 'value');
165+
converter._addNumberInput(block, 'INDEX', 'math_integer', args[0], 1);
166+
return block;
167+
}
168+
169+
return null;
166170
});
167171

168172
converter.registerOnSend('variable', 'index', 1, params => {

test/unit/lib/ruby-to-blocks-converter/variables.test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,35 @@ describe('RubyToBlocksConverter/Variables', () => {
4444
convertAndExpectToEqualBlocks(converter, target, code, expected);
4545
});
4646

47+
test('operator_letter_of', () => {
48+
const code = `${varName}[0]`;
49+
const expected = [
50+
{
51+
opcode: 'operator_letter_of',
52+
inputs: [
53+
{
54+
name: 'STRING',
55+
block: {
56+
opcode: 'data_variable',
57+
fields: [
58+
{
59+
name: 'VARIABLE',
60+
variable: varName
61+
}
62+
]
63+
},
64+
shadow: expectedInfo.makeText('apple')
65+
},
66+
{
67+
name: 'LETTER',
68+
block: expectedInfo.makeNumber(1)
69+
}
70+
]
71+
}
72+
];
73+
convertAndExpectToEqualBlocks(converter, target, code, expected);
74+
});
75+
4776
test('data_setvariableto', () => {
4877
let code;
4978
let expected;

0 commit comments

Comments
 (0)