nilac 0.0.3.7 → 0.0.3.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/bin/nilac.rb CHANGED
@@ -412,6 +412,60 @@ def compile(input_file_path,*output_file_name)
412
412
 
413
413
  end
414
414
 
415
+ def compile_multiple_variable_initialization(input_file_contents,temporary_nila_file)
416
+
417
+ possible_variable_lines = input_file_contents.reject {|element| !element.include?"="}
418
+
419
+ possible_multiple_initialization = possible_variable_lines.reject {|element| !element.split("=")[0].include?","}
420
+
421
+ multiple_initialization_index = []
422
+
423
+ possible_multiple_initialization.each do |statement|
424
+
425
+ location_array = input_file_contents.each_index.select { |index| input_file_contents[index] == statement}
426
+
427
+ multiple_initialization_index << location_array[0]
428
+
429
+ end
430
+
431
+ modified_file_contents = input_file_contents.dup
432
+
433
+ multiple_init_counter = 1
434
+
435
+ possible_multiple_initialization.each_with_index do |line,index|
436
+
437
+ line_split = line.split(" = ")
438
+
439
+ right_side_variables = line_split[0].split(",")
440
+
441
+ replacement_string = "multipleinit#{multiple_init_counter} = #{line_split[1]}\n\n"
442
+
443
+ variable_string = ""
444
+
445
+ right_side_variables.each_with_index do |variable,var_index|
446
+
447
+ variable_string = variable_string + variable.rstrip + " = multipleinit#{multiple_init_counter}[#{var_index}]\n\n"
448
+
449
+ end
450
+
451
+ replacement_string = replacement_string + variable_string
452
+
453
+ modified_file_contents[multiple_initialization_index[index]] = replacement_string
454
+
455
+ end
456
+
457
+ file_id = open(temporary_nila_file, 'w')
458
+
459
+ file_id.write(modified_file_contents.join)
460
+
461
+ file_id.close()
462
+
463
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
464
+
465
+ return line_by_line_contents
466
+
467
+ end
468
+
415
469
  def get_variables(input_file_contents,temporary_nila_file)
416
470
 
417
471
  #This method is solely focused on getting a list of variables to be declared.
@@ -700,6 +754,134 @@ def compile(input_file_path,*output_file_name)
700
754
 
701
755
  end
702
756
 
757
+ def compile_multiple_return(input_array)
758
+
759
+ def find_all_matching_indices(input_string,pattern)
760
+
761
+ locations = []
762
+
763
+ index = input_string.index(pattern)
764
+
765
+ while index != nil
766
+
767
+ locations << index
768
+
769
+ index = input_string.index(pattern,index+1)
770
+
771
+
772
+ end
773
+
774
+ return locations
775
+
776
+
777
+ end
778
+
779
+ modified_input_array = input_array.dup
780
+
781
+ return_statements = input_array.dup.reject {|element| !element.include?"return"}
782
+
783
+ multiple_return_statements = return_statements.dup.reject {|element| !element.include?","}
784
+
785
+ modified_multiple_return_statements = multiple_return_statements.dup
786
+
787
+ return_statement_index = []
788
+
789
+ multiple_return_statements.each do |statement|
790
+
791
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
792
+
793
+ return_statement_index << location_array[0]
794
+
795
+ end
796
+
797
+ multiple_return_statements.each_with_index do |return_statement,index|
798
+
799
+ replacement_counter = 0
800
+
801
+ if return_statement.include? "\""
802
+
803
+ starting_quotes = find_all_matching_indices(return_statement,"\"")
804
+
805
+ for x in 0...(starting_quotes.length)/2
806
+
807
+ quotes = return_statement[starting_quotes[x]..starting_quotes[x+1]]
808
+
809
+ replacement_counter += 1
810
+
811
+ modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(quotes,"repstring#{1}")
812
+
813
+ modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(quotes,"repstring#{1}")
814
+
815
+ end
816
+
817
+ end
818
+
819
+ end
820
+
821
+ modified_multiple_return_statements = modified_multiple_return_statements.reject {|element| !element.include?","}
822
+
823
+ return_statement_index = []
824
+
825
+ modified_multiple_return_statements.each do |statement|
826
+
827
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
828
+
829
+ return_statement_index << location_array[0]
830
+
831
+ end
832
+
833
+ modified_multiple_return_statements.each_with_index do |return_statement,index|
834
+
835
+ method_call_counter = 0
836
+
837
+ if return_statement.include?"("
838
+
839
+ open_paran_location = find_all_matching_indices(return_statement,"(")
840
+
841
+ open_paran_location.each do |paran_index|
842
+
843
+ method_call = return_statement[paran_index..return_statement.index(")",paran_index+1)]
844
+
845
+ method_call_counter += 1
846
+
847
+ modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(method_call,"methodcall#{method_call_counter}")
848
+
849
+ modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(method_call,"methodcall#{method_call_counter}")
850
+
851
+ end
852
+
853
+ end
854
+
855
+ end
856
+
857
+ modified_multiple_return_statements = modified_multiple_return_statements.reject {|element| !element.include?(",")}
858
+
859
+ return_statement_index = []
860
+
861
+ modified_multiple_return_statements.each do |statement|
862
+
863
+ location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
864
+
865
+ return_statement_index << location_array[0]
866
+
867
+ end
868
+
869
+ return_statement_index.each do |index|
870
+
871
+ original_statement = input_array[index]
872
+
873
+ statement_split = original_statement.split("return ")
874
+
875
+ replacement_split = "return [" + statement_split[1].rstrip + "]\n\n"
876
+
877
+ input_array[index] = replacement_split
878
+
879
+ end
880
+
881
+ return input_array
882
+
883
+ end
884
+
703
885
  def compile_function(input_array,temporary_nila_file)
704
886
 
705
887
  modified_input_array = input_array.dup
@@ -776,6 +958,8 @@ def compile(input_file_path,*output_file_name)
776
958
 
777
959
  modified_input_array = add_auto_return_statement(modified_input_array)
778
960
 
961
+ modified_input_array = compile_multiple_return(modified_input_array)
962
+
779
963
  return modified_input_array
780
964
 
781
965
  end
@@ -1238,6 +1422,8 @@ def compile(input_file_path,*output_file_name)
1238
1422
 
1239
1423
  starting_index = starting_line_indices[0]
1240
1424
 
1425
+ begin
1426
+
1241
1427
  for x in 0...initial_starting_lines.length
1242
1428
 
1243
1429
  code_blocks << modified_file_contents[starting_index..block_ending_lines[0]]
@@ -1264,6 +1450,12 @@ def compile(input_file_path,*output_file_name)
1264
1450
 
1265
1451
  end
1266
1452
 
1453
+ rescue TypeError
1454
+
1455
+ puts "Whitespace was left unfixed!"
1456
+
1457
+ end
1458
+
1267
1459
  return modified_file_contents,code_blocks
1268
1460
 
1269
1461
  end
@@ -1474,7 +1666,7 @@ def compile(input_file_path,*output_file_name)
1474
1666
 
1475
1667
  File.delete(temporary_nila_file)
1476
1668
 
1477
- file_id.write("//Written in Nila 0.0.3.3. Visit http://adhithyan15.github.io/nila\n")
1669
+ file_id.write("//Written using Nila. Visit http://adhithyan15.github.io/nila\n")
1478
1670
 
1479
1671
  file_id.write(file_contents.join)
1480
1672
 
@@ -1500,6 +1692,8 @@ def compile(input_file_path,*output_file_name)
1500
1692
 
1501
1693
  comments = [singleline_comments,multiline_comments]
1502
1694
 
1695
+ file_contents = compile_multiple_variable_initialization(file_contents,temp_file)
1696
+
1503
1697
  list_of_variables,file_contents = get_variables(file_contents,temp_file)
1504
1698
 
1505
1699
  file_contents = compile_arrays(file_contents)
@@ -1576,7 +1770,21 @@ def find_file_name(input_path,file_extension)
1576
1770
 
1577
1771
  end
1578
1772
 
1579
- nilac_version = "0.0.3.7"
1773
+ def find_file_path(input_path,file_extension)
1774
+
1775
+ extension_remover = input_path.split(file_extension)
1776
+
1777
+ remaining_string = extension_remover[0].reverse
1778
+
1779
+ path_finder = remaining_string.index("/")
1780
+
1781
+ remaining_string = remaining_string.reverse
1782
+
1783
+ return remaining_string[0...remaining_string.length-path_finder]
1784
+
1785
+ end
1786
+
1787
+ nilac_version = "0.0.3.8"
1580
1788
 
1581
1789
  opts = Slop.parse do
1582
1790
  on :c, :compile=, 'Compile Nila File', as:Array, delimiter:":"
@@ -1712,7 +1920,7 @@ elsif opts[:run] != nil
1712
1920
 
1713
1921
  compile(file_path)
1714
1922
 
1715
- js_file_name = find_file_name(file_path,".nila") + ".js"
1923
+ js_file_name = find_file_path(file_path,".nila") + find_file_name(file_path,".nila") + ".js"
1716
1924
 
1717
1925
  node_output = `node #{js_file_name}`
1718
1926
 
data/lib/nilac/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nilac
2
- VERSION = "0.0.3.7"
2
+ VERSION = "0.0.3.8"
3
3
  end
@@ -0,0 +1,17 @@
1
+ Feature: Javascript, by default, doesn't allow for the return of multiple values. So this is Nila's attempt to fix this problem.
2
+ Scenario: Input function with multiple return statement
3
+ Given the input file "multiple_return.nila"
4
+ When the ~compiler is run
5
+ The output file must be "multiple_return.js"
6
+ The output file must equal "correct_multiple_return.js"
7
+
8
+ Scenario: Input function with a single return statement
9
+ Given the input file "single_return.nila"
10
+ When the ~compiler is run
11
+ The output file must be "single_return.js"
12
+ The output file must equal "correct_single_return.js"
13
+
14
+ Configurations:
15
+
16
+ ~compiler => bin/nilac.rb
17
+ :v $cliusage => ruby :v --compile $file
@@ -0,0 +1,12 @@
1
+ Feature: Javascript doesn't allow multiple variable initializations from a method call. So this feature attempts to fix this problem. This feature is complementary to the multiple return feature.
2
+
3
+ Scenario: Multiple variables initialized from a method call.
4
+ Given the input file "multiple_initialization.nila"
5
+ When the ~compiler is run
6
+ The output file must be "multiple_initialization.js"
7
+ The output file must equal "correct_initialization.js"
8
+
9
+ Configurations:
10
+
11
+ ~compiler => bin/nilac.rb
12
+ :v $cliusage => ruby :v --compile $file
@@ -1,4 +1,4 @@
1
- //Written in Nila 0.0.3.2. Visit http://adhithyan15.github.io/nila
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
2
  (function() {
3
3
  console.log("Hello World!");
4
4
 
@@ -0,0 +1,21 @@
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
+ (function() {
3
+ var multipleinit1, first_name, last_name;
4
+
5
+ // This file demonstrates multiple variable initialization
6
+
7
+ function parse_name(input_name) {
8
+ var name_split;
9
+ name_split = input_name.split(" ");
10
+ return [name_split[0],name_split[1]];
11
+ }
12
+
13
+ multipleinit1 = parse_name("Adhithya Rajasekaran");
14
+
15
+ first_name = multipleinit1[0];
16
+
17
+ last_name = multipleinit1[1];
18
+
19
+ console.log(first_name + " " + last_name);
20
+
21
+ }).call(this);
@@ -0,0 +1,19 @@
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
+ (function() {
3
+ var parsed_name;
4
+
5
+ // This method demonstrates multiple return values
6
+
7
+ function parse_name(input_name) {
8
+ var name_split;
9
+ name_split = input_name.split(" ");
10
+ return [name_split[0],name_split[1]];
11
+ }
12
+
13
+ function test_method() {
14
+ return console.log("Hello, Adhithya");
15
+ }
16
+
17
+ parsed_name = parse_name("Adhithya Rajasekaran");
18
+
19
+ }).call(this);
@@ -1,4 +1,4 @@
1
- //Written in Nila 0.0.3.2. Visit http://adhithyan15.github.io/nila
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
2
  (function() {
3
3
  function subtract(num1,num2) {
4
4
  return num1-num2;
@@ -1,4 +1,4 @@
1
- //Written in Nila 0.0.3.2. Visit http://adhithyan15.github.io/nila
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
2
  (function() {
3
3
  function subtract(num1,num2) {
4
4
  return num1-num2;
@@ -0,0 +1,21 @@
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
+ (function() {
3
+ var multipleinit1, first_name, last_name;
4
+
5
+ // This file demonstrates multiple variable initialization
6
+
7
+ function parse_name(input_name) {
8
+ var name_split;
9
+ name_split = input_name.split(" ");
10
+ return [name_split[0],name_split[1]];
11
+ }
12
+
13
+ multipleinit1 = parse_name("Adhithya Rajasekaran");
14
+
15
+ first_name = multipleinit1[0];
16
+
17
+ last_name = multipleinit1[1];
18
+
19
+ console.log(first_name + " " + last_name);
20
+
21
+ }).call(this);
@@ -0,0 +1,13 @@
1
+ # This file demonstrates multiple variable initialization
2
+
3
+ def parse_name(input_name)
4
+
5
+ name_split = input_name.split(" ")
6
+
7
+ return name_split[0],name_split[1]
8
+
9
+ end
10
+
11
+ first_name,last_name = parse_name("Adhithya Rajasekaran")
12
+
13
+ puts first_name + " " + last_name
@@ -0,0 +1,19 @@
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
+ (function() {
3
+ var parsed_name;
4
+
5
+ // This method demonstrates multiple return values
6
+
7
+ function parse_name(input_name) {
8
+ var name_split;
9
+ name_split = input_name.split(" ");
10
+ return [name_split[0],name_split[1]];
11
+ }
12
+
13
+ function test_method() {
14
+ return console.log("Hello, Adhithya");
15
+ }
16
+
17
+ parsed_name = parse_name("Adhithya Rajasekaran");
18
+
19
+ }).call(this);
@@ -0,0 +1,17 @@
1
+ # This method demonstrates multiple return values
2
+
3
+ def parse_name(input_name)
4
+
5
+ name_split = input_name.split(" ")
6
+
7
+ return name_split[0],name_split[1]
8
+
9
+ end
10
+
11
+ def test_method()
12
+
13
+ puts "Hello, Adhithya"
14
+
15
+ end
16
+
17
+ parsed_name = parse_name("Adhithya Rajasekaran")
@@ -1,4 +1,4 @@
1
- //Written in Nila 0.0.3.2. Visit http://adhithyan15.github.io/nila
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
2
  (function() {
3
3
  var hello, msg, message, goal_reached;
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nilac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3.7
4
+ version: 0.0.3.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -69,10 +69,18 @@ files:
69
69
  - shark/features/add_auto_return_statement.feature
70
70
  - shark/features/barebones_compilation.feature
71
71
  - shark/features/fix_newlines.feature
72
+ - shark/features/method_multiple_return.feature
73
+ - shark/features/multiple_variable_initialization.feature
72
74
  - shark/test_files/correct.js
75
+ - shark/test_files/correct_initialization.js
76
+ - shark/test_files/correct_multiple_return.js
73
77
  - shark/test_files/correct_return.js
74
78
  - shark/test_files/correct_single_return.js
75
79
  - shark/test_files/erratic.nila
80
+ - shark/test_files/multiple_initialization.js
81
+ - shark/test_files/multiple_initialization.nila
82
+ - shark/test_files/multiple_return.js
83
+ - shark/test_files/multiple_return.nila
76
84
  - shark/test_files/no_return.nila
77
85
  - shark/test_files/perfect.js
78
86
  - shark/test_files/simple.nila