to_source 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Changelog.md CHANGED
@@ -1,3 +1,12 @@
1
+ # v0.2.8 2013-01-3
2
+
3
+ * [Changed] Emit many times more ugly code, but correctnes > beautifulnes
4
+ * [fixed] Emit break with parantheses
5
+ * [fixed] Emit op assign and as "&&="
6
+ * [fixed] Emit op assign or as "||="
7
+
8
+ [Compare v0.2.7..v0.2.8](https://github.com/mbj/to_source/compare/v0.2.7...v0.2.8)
9
+
1
10
  # v0.2.7 2013-01-2
2
11
 
3
12
  * [fixed] Emit super with blocks correctly
data/TODO CHANGED
@@ -1,3 +1,5 @@
1
+ * Do not emit parantheses around non keywords in binary operations (this will beautify source again)
2
+ * Rewrite this library it is ultra hacky and adhoc
1
3
  * Fix parsing errors from ruby parser
2
4
  It breaks on def $keyword.
3
5
  * Do a metric driven refactor once flay flog and friends work.
@@ -149,8 +149,9 @@ module ToSource
149
149
  def break(node)
150
150
  emit('break')
151
151
  if node.value.class != Rubinius::AST::NilLiteral
152
- emit(' ')
152
+ emit('(')
153
153
  dispatch(node.value)
154
+ emit(')')
154
155
  end
155
156
  end
156
157
 
@@ -1415,13 +1416,54 @@ module ToSource
1415
1416
  # @api private
1416
1417
  #
1417
1418
  def and(node)
1419
+ binary(node, '&&')
1420
+ end
1421
+
1422
+ # Call block while emitting parantheses
1423
+ #
1424
+ # @return [undefined]
1425
+ #
1426
+ # @api private
1427
+ #
1428
+ def parantheses
1418
1429
  emit('(')
1419
- dispatch(node.left)
1420
- emit(' && ')
1421
- dispatch(node.right)
1430
+ yield
1422
1431
  emit(')')
1423
1432
  end
1424
1433
 
1434
+ # Emit binary operation
1435
+ #
1436
+ # @param [Rubnius::AST::Node] node
1437
+ #
1438
+ # @param [Symbol] symbol
1439
+ # the operation symbol
1440
+ #
1441
+ # @api private
1442
+ #
1443
+ def binary(node, symbol)
1444
+ parantheses do
1445
+ parantheses { dispatch(node.left) }
1446
+ emit(" #{symbol} ")
1447
+ parantheses { dispatch(node.right) }
1448
+ end
1449
+ end
1450
+
1451
+ # Emit binary shortcut
1452
+ #
1453
+ # @param [Rubinius::AST::Node] node
1454
+ #
1455
+ # @param [Symbol] symbol
1456
+ #
1457
+ # @api private
1458
+ #
1459
+ def binary_shortcut(node, symbol)
1460
+ parantheses do
1461
+ dispatch(node.left)
1462
+ emit(" #{symbol} ")
1463
+ parantheses { dispatch(node.right.value) }
1464
+ end
1465
+ end
1466
+
1425
1467
  # Emit or
1426
1468
  #
1427
1469
  # @param [Rubinius::AST::Node] node
@@ -1431,11 +1473,7 @@ module ToSource
1431
1473
  # @api private
1432
1474
  #
1433
1475
  def or(node)
1434
- emit('(')
1435
- dispatch(node.left)
1436
- emit(' || ')
1437
- dispatch(node.right)
1438
- emit(')')
1476
+ binary(node, '||')
1439
1477
  end
1440
1478
 
1441
1479
  # Emit and operation with assignment
@@ -1447,9 +1485,7 @@ module ToSource
1447
1485
  # @api private
1448
1486
  #
1449
1487
  def op_assign_and(node)
1450
- dispatch(node.left)
1451
- emit(' && ')
1452
- dispatch(node.right)
1488
+ binary_shortcut(node, :'&&=')
1453
1489
  end
1454
1490
 
1455
1491
  # Emit or operation with assignment
@@ -1461,9 +1497,7 @@ module ToSource
1461
1497
  # @api private
1462
1498
  #
1463
1499
  def op_assign_or(node)
1464
- dispatch(node.left)
1465
- emit(' || ')
1466
- dispatch(node.right)
1500
+ binary_shortcut(node, :'||=')
1467
1501
  end
1468
1502
  alias_method :op_assign_or19, :op_assign_or
1469
1503
 
@@ -1845,17 +1879,14 @@ module ToSource
1845
1879
  def process_binary_operator(node)
1846
1880
  name = node.name
1847
1881
  return unless OPERATORS.include?(name)
1848
- return if node.arguments.array.length != 1
1849
1882
 
1850
1883
  operand = node.arguments.array[0]
1851
1884
 
1852
- emit('(')
1853
- dispatch(node.receiver)
1854
-
1855
- emit(" #{name.to_s} ")
1856
- dispatch(operand)
1857
-
1858
- emit(')')
1885
+ parantheses do
1886
+ parantheses { dispatch(node.receiver) }
1887
+ emit(" #{name.to_s} ")
1888
+ parantheses { dispatch(operand) }
1889
+ end
1859
1890
  end
1860
1891
  end
1861
1892
  end
@@ -17,6 +17,13 @@ describe ToSource::Visitor,'.run' do
17
17
  it 'should create original source' do
18
18
  should eql(compress(expected_source))
19
19
  end
20
+
21
+ it 'should be able to round trip generated source also' do
22
+ generated = subject
23
+ ast = subject.to_ast
24
+ second = described_class.run(ast)
25
+ generated.should eql(second)
26
+ end
20
27
  end
21
28
 
22
29
  def self.assert_source(source)
@@ -542,7 +549,7 @@ describe ToSource::Visitor,'.run' do
542
549
  end
543
550
 
544
551
  context 'break with arguments' do
545
- assert_source 'break a'
552
+ assert_source 'break(a)'
546
553
  end
547
554
 
548
555
  context 'next' do
@@ -578,51 +585,56 @@ describe ToSource::Visitor,'.run' do
578
585
  context 'binary operators' do
579
586
  %w(+ - * / & | && || << >> == === != <= < <=> > >= =~ !~ ^ **).each do |operator|
580
587
  context "on literals #{operator}" do
581
- assert_source "(1 #{operator} 2)"
588
+ assert_source "((1) #{operator} (2))"
582
589
  end
583
590
 
584
591
  context "on self #{operator}" do
585
- assert_source "(self #{operator} b)"
592
+ assert_source "((self) #{operator} (b))"
586
593
  end
587
594
 
588
595
  context "on calls #{operator}" do
589
- assert_source "(a #{operator} b)"
596
+ assert_source "((a) #{operator} (b))"
590
597
  end
598
+ end
591
599
 
600
+ context 'binary operator and keywords' do
601
+ assert_source '((a) || (break(foo)))'
592
602
  end
593
603
 
594
604
  context 'nested binary operators' do
595
- assert_source '(a || (b || c))'
605
+ assert_source '((a) || (((b) || (c))))'
596
606
  end
597
607
  end
598
608
 
599
609
  context 'expansion of shortcuts' do
600
610
  context 'on += operator' do
601
- assert_converts 'a = (a + 2)', 'a += 2'
611
+ assert_converts 'a = ((a) + (2))', 'a += 2'
602
612
  end
603
613
 
604
614
  context 'on -= operator' do
605
- assert_converts 'a = (a - 2)', 'a -= 2'
615
+ assert_converts 'a = ((a) - (2))', 'a -= 2'
606
616
  end
607
617
 
608
618
  context 'on **= operator' do
609
- assert_converts 'a = (a ** 2)', 'a **= 2'
619
+ assert_converts 'a = ((a) ** (2))', 'a **= 2'
610
620
  end
611
621
 
612
622
  context 'on *= operator' do
613
- assert_converts 'a = (a * 2)', 'a *= 2'
623
+ assert_converts 'a = ((a) * (2))', 'a *= 2'
614
624
  end
615
625
 
616
626
  context 'on /= operator' do
617
- assert_converts 'a = (a / 2)', 'a /= 2'
627
+ assert_converts 'a = ((a) / (2))', 'a /= 2'
618
628
  end
629
+ end
619
630
 
631
+ context 'shortcuts' do
620
632
  context 'on &&= operator' do
621
- assert_converts 'a && a = 2', 'a &&= 2'
633
+ assert_source '(a &&= (b))'
622
634
  end
623
635
 
624
636
  context 'on ||= operator' do
625
- assert_converts 'a || a = 2', 'a ||= 2'
637
+ assert_source '(a ||= (2))'
626
638
  end
627
639
  end
628
640
 
data/to_source.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = 'to_source'
4
- s.version = '0.2.7'
4
+ s.version = '0.2.8'
5
5
  s.authors = ['Josep M. Bach', 'Markus Schirp']
6
6
  s.email = ['josep.m.bach@gmail.com', 'mbj@seonic.net']
7
7
  s.homepage = 'http://github.com/txus/to_source'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: to_source
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-01 00:00:00.000000000 Z
13
+ date: 2013-01-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: adamantium