nilac 0.0.4.3.9.1 → 0.0.4.3.9.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e0d46d6d6e2aaa881ffb278fbc8f238936e7864
4
- data.tar.gz: ee0597f8e948fe0b0822c5ccde1c0143c06b4c18
3
+ metadata.gz: 8cec9f92a950d69f17f9a9e5d2fc2e240bffa540
4
+ data.tar.gz: 5c4ab209155e48ad3c44c934e7abfbe9d6d5e82b
5
5
  SHA512:
6
- metadata.gz: da6a215afb5a19e75ad26820acb0c98fdcece13e511fee35a194e5448485301d13ed990966db651b5edfb40b92c06a09da0b9e5fca249fcf9323132f617c8fa9
7
- data.tar.gz: e22a907ec7aa2f7a776a9c41dc4de56056cec67c5ae299c300074197a1b7120326a491137cd093784ce110937baf02a3c913fe34f946fb6235f4b6d734bceccf
6
+ metadata.gz: c0508eff8f8d817ece1ea7c4359cd87f9135db0dad59cd399d6b1e5d664673bc2981bed328721108ecac990289d930ffc7b8eb280f6e5db7e4c1c40cd4a5b74c
7
+ data.tar.gz: fa3284945a8f4564e1e4611b3d6678d28808650d009fbda5472bfa356cf81d2a3d866e980f83ff933a8d054282301ac8de8c4f07b4733f0d7e8cb4ca771b4223
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .idea
data/bin/nilac CHANGED
@@ -8,6 +8,20 @@
8
8
  require 'slop'
9
9
  require 'fileutils'
10
10
 
11
+ # The following are error classes used by Nilac to give you detailed error information
12
+
13
+ class ParseError < RuntimeError
14
+
15
+ def initialize(message)
16
+
17
+ puts "ParseError: " + message
18
+
19
+ abort
20
+
21
+ end
22
+
23
+ end
24
+
11
25
 
12
26
  def compile(input_file_path, *output_file_name)
13
27
 
@@ -784,6 +798,39 @@ def compile(input_file_path, *output_file_name)
784
798
  # puts "Filling the #{container} with #{liquid}"
785
799
  # end
786
800
 
801
+ def errorFree(function_params)
802
+
803
+ # This method checks for use cases in complex arguments where a default argument is used
804
+ # after an optional argument. This will result in erroneous output. So this method will
805
+ # stop it from happening.
806
+
807
+ # Example:
808
+ # def method_name(a,b,*c,d = 1,c,e)
809
+
810
+ optional_param = function_params.reject {|element| !replace_strings(element).include?("*")}[0]
811
+
812
+ unless optional_param.nil?
813
+
814
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
815
+
816
+ if after_splat.reject {|element| !element.include?("=")}.empty?
817
+
818
+ true
819
+
820
+ else
821
+
822
+ ParseError.new("You cannot have default argument after an optional argument! Change the following usage!\n#{function_params.join(",")}")
823
+
824
+ end
825
+
826
+ else
827
+
828
+ true
829
+
830
+ end
831
+
832
+ end
833
+
787
834
  def parse_default_values(input_function_definition)
788
835
 
789
836
  split1, split2 = input_function_definition.split("(")
@@ -792,23 +839,27 @@ def compile(input_file_path, *output_file_name)
792
839
 
793
840
  function_parameters = split2.split(",")
794
841
 
795
- default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
842
+ if errorFree(function_parameters)
796
843
 
797
- replacement_parameters = []
844
+ default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
798
845
 
799
- replacement_string = ""
846
+ replacement_parameters = []
800
847
 
801
- default_value_parameters.each do |paramvalue|
848
+ replacement_string = ""
802
849
 
803
- param, value = paramvalue.split("=")
850
+ default_value_parameters.each do |paramvalue|
804
851
 
805
- replacement_parameters << param.lstrip.rstrip
852
+ param, value = paramvalue.split("=")
806
853
 
807
- replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
854
+ replacement_parameters << param.lstrip.rstrip
808
855
 
809
- end
856
+ replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
810
857
 
811
- return replacement_string, default_value_parameters, replacement_parameters
858
+ end
859
+
860
+ return replacement_string, default_value_parameters, replacement_parameters
861
+
862
+ end
812
863
 
813
864
  end
814
865
 
@@ -858,7 +909,7 @@ def compile(input_file_path, *output_file_name)
858
909
 
859
910
  input_file_contents[current_line_index] = modified_line
860
911
 
861
- input_file_contents[current_line_index + 1] = replacement_string
912
+ input_file_contents.insert(current_line_index+1,replacement_string)
862
913
 
863
914
  end
864
915
 
@@ -1840,7 +1891,7 @@ def compile(input_file_path, *output_file_name)
1840
1891
 
1841
1892
  else
1842
1893
 
1843
- return variables.uniq
1894
+ return variables.uniq.sort
1844
1895
 
1845
1896
  end
1846
1897
 
@@ -1882,6 +1933,8 @@ def compile(input_file_path, *output_file_name)
1882
1933
 
1883
1934
  rejected_array = reversed_input_array.reject { |content| content.lstrip.eql?("") }
1884
1935
 
1936
+ rejected_array = rejected_array.reject {|content| content.strip.eql?("")}
1937
+
1885
1938
  rejected_array = rejected_array[1..-1]
1886
1939
 
1887
1940
  if !rejected_array[0].strip.eql?("}")
@@ -2106,6 +2159,16 @@ def compile(input_file_path, *output_file_name)
2106
2159
 
2107
2160
  modified_input_array = compile_parallel_assignment(modified_input_array, temporary_nila_file)
2108
2161
 
2162
+ modified_input_array = compile_multiple_ruby_func_calls(modified_input_array)
2163
+
2164
+ modified_input_array = add_auto_return_statement(modified_input_array)
2165
+
2166
+ modified_input_array = compile_multiple_return(modified_input_array)
2167
+
2168
+ modified_input_array = coffee_type_function(modified_input_array)
2169
+
2170
+ modified_input_array = compile_splats(modified_input_array)
2171
+
2109
2172
  variables = lexical_scoped_variables(modified_input_array)
2110
2173
 
2111
2174
  if !variables.empty?
@@ -2118,12 +2181,6 @@ def compile(input_file_path, *output_file_name)
2118
2181
 
2119
2182
  modified_input_array = remove_question_marks(modified_input_array, variables, temporary_nila_file)
2120
2183
 
2121
- modified_input_array = add_auto_return_statement(modified_input_array)
2122
-
2123
- modified_input_array = compile_multiple_return(modified_input_array)
2124
-
2125
- modified_input_array = coffee_type_function(modified_input_array)
2126
-
2127
2184
  return modified_input_array
2128
2185
 
2129
2186
  end
@@ -2148,6 +2205,237 @@ def compile(input_file_path, *output_file_name)
2148
2205
 
2149
2206
  end
2150
2207
 
2208
+ def compile_splats(input_function_block)
2209
+
2210
+ def strToArray(input_string)
2211
+
2212
+ file_id = File.new('hello.nila','w')
2213
+
2214
+ file_id.write(input_string)
2215
+
2216
+ file_id.close()
2217
+
2218
+ line_by_line_contents = read_file_line_by_line('hello.nila')
2219
+
2220
+ File.delete(file_id)
2221
+
2222
+ return line_by_line_contents
2223
+
2224
+ end
2225
+
2226
+ def errorFree(function_params,optional_param)
2227
+
2228
+ # This method checks for use cases in complex arguments where a default argument is used
2229
+ # after an optional argument. This will result in erroneous output. So this method will
2230
+ # stop it from happening.
2231
+
2232
+ # Example:
2233
+ # def method_name(a,b,*c,d = 1,c,e)
2234
+
2235
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
2236
+
2237
+ if after_splat.reject {|element| !element.include?("=")}.empty?
2238
+
2239
+ true
2240
+
2241
+ else
2242
+
2243
+ raise "You cannot have a default argument after an optional argument!"
2244
+
2245
+ false
2246
+
2247
+ end
2248
+
2249
+ end
2250
+
2251
+ function_params = input_function_block[0].split("function(")[1].split(")")[0].split(",")
2252
+
2253
+ unless function_params.reject{|element| !replace_strings(element).include?("*")}.empty?
2254
+
2255
+ mod_function_params = function_params.reject {|element| replace_strings(element).include?("*")}
2256
+
2257
+ opt_index = 0
2258
+
2259
+ # If there are multiple optional params declared by mistake, only the first optional param is used.
2260
+
2261
+ optional_param = function_params.reject {|element| !replace_strings(element).include?("*")}[0]
2262
+
2263
+ if function_params.index(optional_param).eql?(function_params.length-1)
2264
+
2265
+ mod_function_params.each_with_index do |param,index|
2266
+
2267
+ input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
2268
+
2269
+ opt_index = index + 1
2270
+
2271
+ end
2272
+
2273
+ replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
2274
+
2275
+ replacement_string += "for (var i=#{opt_index};i<arguments.length;i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
2276
+
2277
+ input_function_block.insert(opt_index+1,replacement_string)
2278
+
2279
+ input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
2280
+
2281
+ else
2282
+
2283
+ before_splat = function_params[0...function_params.index(optional_param)]
2284
+
2285
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
2286
+
2287
+ cont_index = 0
2288
+
2289
+ if errorFree(function_params,optional_param)
2290
+
2291
+ before_splat.each_with_index do |param,index|
2292
+
2293
+ input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
2294
+
2295
+ cont_index = index + 1
2296
+
2297
+ end
2298
+
2299
+ after_splat.each_with_index do |param,index|
2300
+
2301
+ input_function_block.insert(cont_index+1,"#{param} = arguments[arguments.length-#{after_splat.length - index}]\n\n")
2302
+
2303
+ cont_index = cont_index + 1
2304
+
2305
+ end
2306
+
2307
+ replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
2308
+
2309
+ replacement_string += "for (var i=#{function_params.index(optional_param)};i < arguments.length-#{after_splat.length};i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
2310
+
2311
+ input_function_block.insert(cont_index+1,replacement_string)
2312
+
2313
+ input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
2314
+
2315
+ end
2316
+
2317
+ end
2318
+
2319
+ end
2320
+
2321
+ return strToArray(input_function_block.join)
2322
+
2323
+ end
2324
+
2325
+ def compile_multiple_ruby_func_calls(input_file_contents)
2326
+
2327
+ def strToArray(input_string)
2328
+
2329
+ file_id = File.new('hello.nila','w')
2330
+
2331
+ file_id.write(input_string)
2332
+
2333
+ file_id.close()
2334
+
2335
+ line_by_line_contents = read_file_line_by_line('hello.nila')
2336
+
2337
+ File.delete(file_id)
2338
+
2339
+ return line_by_line_contents
2340
+
2341
+ end
2342
+
2343
+ def replace_strings(input_string)
2344
+
2345
+ string_counter = 0
2346
+
2347
+ if input_string.count("\"") % 2 == 0
2348
+
2349
+ while input_string.include?("\"")
2350
+
2351
+ string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
2352
+
2353
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
2354
+
2355
+ string_counter += 1
2356
+
2357
+ end
2358
+
2359
+ end
2360
+
2361
+ if input_string.count("'") % 2 == 0
2362
+
2363
+ while input_string.include?("'")
2364
+
2365
+ string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
2366
+
2367
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
2368
+
2369
+ string_counter += 1
2370
+
2371
+ end
2372
+
2373
+ end
2374
+
2375
+ input_string = input_string.gsub(/\((\w{0,},)*\w{0,}\)/,"--$k$")
2376
+
2377
+ return input_string
2378
+
2379
+ end
2380
+
2381
+ function_calls = []
2382
+
2383
+ replacement_calls = []
2384
+
2385
+ function_map = %w{puts p print}
2386
+
2387
+ javascript_regexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
2388
+
2389
+ stringified_input = input_file_contents.collect {|element| replace_strings(element)}
2390
+
2391
+ function_map.each do |func|
2392
+
2393
+ func_calls = input_file_contents.reject {|line| !(line.include?(func+"(") or line.include?(func+" ") and line.index(javascript_regexp) == nil)}
2394
+
2395
+ modified_func_calls = func_calls.collect {|element| replace_strings(element)}
2396
+
2397
+ modified_func_calls = modified_func_calls.reject {|element| !element.include?(",")}
2398
+
2399
+ call_collector = []
2400
+
2401
+ modified_func_calls.each_with_index do |ele|
2402
+
2403
+ call_collector << input_file_contents[stringified_input.index(ele)]
2404
+
2405
+ end
2406
+
2407
+ function_calls << modified_func_calls
2408
+
2409
+ rep_calls = []
2410
+
2411
+ call_collector.each do |fcall|
2412
+
2413
+ multiple_call = fcall.split(func)[1].split(",")
2414
+
2415
+ multiple_call = multiple_call.collect {|element| "\n#{func} " + element.strip + "\n\n"}
2416
+
2417
+ rep_calls << multiple_call.join
2418
+
2419
+ end
2420
+
2421
+ replacement_calls << rep_calls
2422
+
2423
+ end
2424
+
2425
+ replacement_calls = replacement_calls.flatten
2426
+
2427
+ function_calls = function_calls.flatten
2428
+
2429
+ function_calls.each_with_index do |fcall,index|
2430
+
2431
+ input_file_contents[stringified_input.index(fcall)] = replacement_calls[index]
2432
+
2433
+ end
2434
+
2435
+ return strToArray(input_file_contents.join)
2436
+
2437
+ end
2438
+
2151
2439
  joined_file_contents = input_file_contents.join
2152
2440
 
2153
2441
  unless named_code_blocks.empty?
@@ -2190,7 +2478,7 @@ def compile(input_file_path, *output_file_name)
2190
2478
 
2191
2479
  file_id.close()
2192
2480
 
2193
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
2481
+ line_by_line_contents = compile_multiple_ruby_func_calls(read_file_line_by_line(temporary_nila_file))
2194
2482
 
2195
2483
  return line_by_line_contents, function_names
2196
2484
 
@@ -2446,6 +2734,8 @@ def compile(input_file_path, *output_file_name)
2446
2734
 
2447
2735
  modified_string = modified_string.sub(function+" ", function+"(")
2448
2736
 
2737
+ modified_string = modified_string.split("#{function}(")[0] + "#{function}(" + modified_string.split("#{function}(")[1].lstrip
2738
+
2449
2739
  modified_string = modified_string.sub("\n", ")\n")
2450
2740
 
2451
2741
  joined_file_contents = joined_file_contents.sub(string, modified_string)
data/lib/nilac/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nilac
2
- VERSION = "0.0.4.3.9.1"
2
+ VERSION = "0.0.4.3.9.2"
3
3
  end
@@ -0,0 +1,11 @@
1
+ Feature: This feature brings powerful Splat arguments for Methods/Functions
2
+ Scenario: Input file with multiple splats parameters for methods/functions
3
+ Given the input file "splats.nila"
4
+ When the ~compiler is run
5
+ The output file must be "splats.js"
6
+ The output file must equal "correct_splats.js"
7
+
8
+ Configurations:
9
+
10
+ ~compiler => src/nilac.rb
11
+ :v $cliusage => ruby :v --compile $file
@@ -6,7 +6,7 @@ case grade
6
6
  when "A", "B"
7
7
  puts 'You are pretty smart!'
8
8
  when "C"
9
- puts 'You are intelligent!'
9
+ puts 'You are reasonably intelligent!'
10
10
  end
11
11
 
12
12
  end
@@ -14,7 +14,7 @@
14
14
  console.log('You are pretty smart!');
15
15
  break;
16
16
  case "C":
17
- console.log('You are intelligent!');
17
+ console.log('You are reasonably intelligent!');
18
18
  break;
19
19
  }
20
20
  }
@@ -0,0 +1,89 @@
1
+ //Written using Nila. Visit http://adhithyan15.github.io/nila
2
+ (function() {
3
+ var args_unleashed, default_args, mixed_args, two_or_more;
4
+
5
+ // These example were taken from The Well Grounded Rubyist by Manning
6
+
7
+ // Copyright: Manning Publications
8
+
9
+ two_or_more = function() {
10
+ var a, b, c;
11
+ a = arguments[0];
12
+ b = arguments[1];
13
+ c = [];
14
+ for (var i=2;i<arguments.length;i++) {
15
+ c.push(arguments[i]);
16
+ }
17
+ console.log("I require two or more arguments!");
18
+ console.log("And sure enough, I got: ");
19
+ console.log(a);
20
+ console.log(b);
21
+ return console.log(c);
22
+ };
23
+
24
+ two_or_more(1,2,3,4,5);
25
+
26
+ default_args = function(a,b,c) {
27
+ if (c == null) {
28
+ c = 1;
29
+ }
30
+ console.log("Values of variables: ");
31
+ console.log(a);
32
+ console.log(b);
33
+ return console.log(c);
34
+ };
35
+
36
+ default_args(3,2);
37
+
38
+ default_args(4,5,6);
39
+
40
+ mixed_args = function() {
41
+ var a, b, c, d, e, f;
42
+ a = arguments[0];
43
+ b = arguments[1];
44
+ c = arguments[2];
45
+ e = arguments[arguments.length-2];
46
+ f = arguments[arguments.length-1];
47
+ d = [];
48
+ for (var i=3;i < arguments.length-2;i++) {
49
+ d.push(arguments[i]);
50
+ }
51
+ console.log("Arguments:");
52
+ console.log(a);
53
+ console.log(b);
54
+ console.log(c);
55
+ console.log(d);
56
+ console.log(e);
57
+ return console.log(f);
58
+ };
59
+
60
+ mixed_args(0,1,2,3,4,5,6,7,8);
61
+
62
+ args_unleashed = function() {
63
+ var a, b, c, d, e;
64
+ a = arguments[0];
65
+ b = arguments[1];
66
+ d = arguments[arguments.length-2];
67
+ e = arguments[arguments.length-1];
68
+ c = [];
69
+ for (var i=2;i < arguments.length-2;i++) {
70
+ c.push(arguments[i]);
71
+ }
72
+ if (b == null) {
73
+ b=1;
74
+ }
75
+ console.log("Arguments:");
76
+ console.log(a);
77
+ console.log(b);
78
+ console.log(c);
79
+ console.log(d);
80
+ return console.log(e);
81
+ };
82
+
83
+ args_unleashed(1,2,3,4,5);
84
+
85
+ args_unleashed(1,2,3,4);
86
+
87
+ args_unleashed(1,2,3,4,5,6,7,8);
88
+
89
+ }).call(this);
@@ -0,0 +1,36 @@
1
+ # These example were taken from The Well Grounded Rubyist by Manning
2
+ # Copyright: Manning Publications
3
+
4
+ def two_or_more(a,b,*c)
5
+ puts "I require two or more arguments!"
6
+ puts "And sure enough, I got: "
7
+ puts a, b, c
8
+ end
9
+
10
+ two_or_more 1,2,3,4,5
11
+
12
+ def default_args(a,b,c = 1)
13
+ puts "Values of variables: ",a,b,c
14
+ end
15
+
16
+ default_args 3,2
17
+
18
+ default_args 4,5,6
19
+
20
+ def mixed_args(a,b,c,*d,e,f)
21
+ puts "Arguments:"
22
+ puts a,b,c,d,e,f
23
+ end
24
+
25
+ mixed_args(0,1,2,3,4,5,6,7,8)
26
+
27
+ def args_unleashed(a,b=1,*c,d,e)
28
+ puts "Arguments:"
29
+ p a,b,c,d,e
30
+ end
31
+
32
+ args_unleashed(1,2,3,4,5)
33
+
34
+ args_unleashed(1,2,3,4)
35
+
36
+ args_unleashed(1,2,3,4,5,6,7,8)
data/src/nilac.rb CHANGED
@@ -6,6 +6,20 @@
6
6
  require 'slop'
7
7
  require 'fileutils'
8
8
 
9
+ # The following are error classes used by Nilac to give you detailed error information
10
+
11
+ class ParseError < RuntimeError
12
+
13
+ def initialize(message)
14
+
15
+ puts "ParseError: " + message
16
+
17
+ abort
18
+
19
+ end
20
+
21
+ end
22
+
9
23
 
10
24
  def compile(input_file_path, *output_file_name)
11
25
 
@@ -782,6 +796,39 @@ def compile(input_file_path, *output_file_name)
782
796
  # puts "Filling the #{container} with #{liquid}"
783
797
  # end
784
798
 
799
+ def errorFree(function_params)
800
+
801
+ # This method checks for use cases in complex arguments where a default argument is used
802
+ # after an optional argument. This will result in erroneous output. So this method will
803
+ # stop it from happening.
804
+
805
+ # Example:
806
+ # def method_name(a,b,*c,d = 1,c,e)
807
+
808
+ optional_param = function_params.reject {|element| !replace_strings(element).include?("*")}[0]
809
+
810
+ unless optional_param.nil?
811
+
812
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
813
+
814
+ if after_splat.reject {|element| !element.include?("=")}.empty?
815
+
816
+ true
817
+
818
+ else
819
+
820
+ ParseError.new("You cannot have default argument after an optional argument! Change the following usage!\n#{function_params.join(",")}")
821
+
822
+ end
823
+
824
+ else
825
+
826
+ true
827
+
828
+ end
829
+
830
+ end
831
+
785
832
  def parse_default_values(input_function_definition)
786
833
 
787
834
  split1, split2 = input_function_definition.split("(")
@@ -790,23 +837,27 @@ def compile(input_file_path, *output_file_name)
790
837
 
791
838
  function_parameters = split2.split(",")
792
839
 
793
- default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
840
+ if errorFree(function_parameters)
794
841
 
795
- replacement_parameters = []
842
+ default_value_parameters = function_parameters.reject { |element| !element.include? "=" }
796
843
 
797
- replacement_string = ""
844
+ replacement_parameters = []
798
845
 
799
- default_value_parameters.each do |paramvalue|
846
+ replacement_string = ""
800
847
 
801
- param, value = paramvalue.split("=")
848
+ default_value_parameters.each do |paramvalue|
802
849
 
803
- replacement_parameters << param.lstrip.rstrip
850
+ param, value = paramvalue.split("=")
804
851
 
805
- replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
852
+ replacement_parameters << param.lstrip.rstrip
806
853
 
807
- end
854
+ replacement_string = replacement_string + "\n" + "if (#{param.lstrip.rstrip} equequ null) {\n #{paramvalue.lstrip.rstrip}\n}\n" +"\n"
808
855
 
809
- return replacement_string, default_value_parameters, replacement_parameters
856
+ end
857
+
858
+ return replacement_string, default_value_parameters, replacement_parameters
859
+
860
+ end
810
861
 
811
862
  end
812
863
 
@@ -856,7 +907,7 @@ def compile(input_file_path, *output_file_name)
856
907
 
857
908
  input_file_contents[current_line_index] = modified_line
858
909
 
859
- input_file_contents[current_line_index + 1] = replacement_string
910
+ input_file_contents.insert(current_line_index+1,replacement_string)
860
911
 
861
912
  end
862
913
 
@@ -1838,7 +1889,7 @@ def compile(input_file_path, *output_file_name)
1838
1889
 
1839
1890
  else
1840
1891
 
1841
- return variables.uniq
1892
+ return variables.uniq.sort
1842
1893
 
1843
1894
  end
1844
1895
 
@@ -1880,6 +1931,8 @@ def compile(input_file_path, *output_file_name)
1880
1931
 
1881
1932
  rejected_array = reversed_input_array.reject { |content| content.lstrip.eql?("") }
1882
1933
 
1934
+ rejected_array = rejected_array.reject {|content| content.strip.eql?("")}
1935
+
1883
1936
  rejected_array = rejected_array[1..-1]
1884
1937
 
1885
1938
  if !rejected_array[0].strip.eql?("}")
@@ -2104,6 +2157,16 @@ def compile(input_file_path, *output_file_name)
2104
2157
 
2105
2158
  modified_input_array = compile_parallel_assignment(modified_input_array, temporary_nila_file)
2106
2159
 
2160
+ modified_input_array = compile_multiple_ruby_func_calls(modified_input_array)
2161
+
2162
+ modified_input_array = add_auto_return_statement(modified_input_array)
2163
+
2164
+ modified_input_array = compile_multiple_return(modified_input_array)
2165
+
2166
+ modified_input_array = coffee_type_function(modified_input_array)
2167
+
2168
+ modified_input_array = compile_splats(modified_input_array)
2169
+
2107
2170
  variables = lexical_scoped_variables(modified_input_array)
2108
2171
 
2109
2172
  if !variables.empty?
@@ -2116,12 +2179,6 @@ def compile(input_file_path, *output_file_name)
2116
2179
 
2117
2180
  modified_input_array = remove_question_marks(modified_input_array, variables, temporary_nila_file)
2118
2181
 
2119
- modified_input_array = add_auto_return_statement(modified_input_array)
2120
-
2121
- modified_input_array = compile_multiple_return(modified_input_array)
2122
-
2123
- modified_input_array = coffee_type_function(modified_input_array)
2124
-
2125
2182
  return modified_input_array
2126
2183
 
2127
2184
  end
@@ -2146,6 +2203,237 @@ def compile(input_file_path, *output_file_name)
2146
2203
 
2147
2204
  end
2148
2205
 
2206
+ def compile_splats(input_function_block)
2207
+
2208
+ def strToArray(input_string)
2209
+
2210
+ file_id = File.new('hello.nila','w')
2211
+
2212
+ file_id.write(input_string)
2213
+
2214
+ file_id.close()
2215
+
2216
+ line_by_line_contents = read_file_line_by_line('hello.nila')
2217
+
2218
+ File.delete(file_id)
2219
+
2220
+ return line_by_line_contents
2221
+
2222
+ end
2223
+
2224
+ def errorFree(function_params,optional_param)
2225
+
2226
+ # This method checks for use cases in complex arguments where a default argument is used
2227
+ # after an optional argument. This will result in erroneous output. So this method will
2228
+ # stop it from happening.
2229
+
2230
+ # Example:
2231
+ # def method_name(a,b,*c,d = 1,c,e)
2232
+
2233
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
2234
+
2235
+ if after_splat.reject {|element| !element.include?("=")}.empty?
2236
+
2237
+ true
2238
+
2239
+ else
2240
+
2241
+ raise "You cannot have a default argument after an optional argument!"
2242
+
2243
+ false
2244
+
2245
+ end
2246
+
2247
+ end
2248
+
2249
+ function_params = input_function_block[0].split("function(")[1].split(")")[0].split(",")
2250
+
2251
+ unless function_params.reject{|element| !replace_strings(element).include?("*")}.empty?
2252
+
2253
+ mod_function_params = function_params.reject {|element| replace_strings(element).include?("*")}
2254
+
2255
+ opt_index = 0
2256
+
2257
+ # If there are multiple optional params declared by mistake, only the first optional param is used.
2258
+
2259
+ optional_param = function_params.reject {|element| !replace_strings(element).include?("*")}[0]
2260
+
2261
+ if function_params.index(optional_param).eql?(function_params.length-1)
2262
+
2263
+ mod_function_params.each_with_index do |param,index|
2264
+
2265
+ input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
2266
+
2267
+ opt_index = index + 1
2268
+
2269
+ end
2270
+
2271
+ replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
2272
+
2273
+ replacement_string += "for (var i=#{opt_index};i<arguments.length;i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
2274
+
2275
+ input_function_block.insert(opt_index+1,replacement_string)
2276
+
2277
+ input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
2278
+
2279
+ else
2280
+
2281
+ before_splat = function_params[0...function_params.index(optional_param)]
2282
+
2283
+ after_splat = function_params[function_params.index(optional_param)+1..-1]
2284
+
2285
+ cont_index = 0
2286
+
2287
+ if errorFree(function_params,optional_param)
2288
+
2289
+ before_splat.each_with_index do |param,index|
2290
+
2291
+ input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
2292
+
2293
+ cont_index = index + 1
2294
+
2295
+ end
2296
+
2297
+ after_splat.each_with_index do |param,index|
2298
+
2299
+ input_function_block.insert(cont_index+1,"#{param} = arguments[arguments.length-#{after_splat.length - index}]\n\n")
2300
+
2301
+ cont_index = cont_index + 1
2302
+
2303
+ end
2304
+
2305
+ replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
2306
+
2307
+ replacement_string += "for (var i=#{function_params.index(optional_param)};i < arguments.length-#{after_splat.length};i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
2308
+
2309
+ input_function_block.insert(cont_index+1,replacement_string)
2310
+
2311
+ input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
2312
+
2313
+ end
2314
+
2315
+ end
2316
+
2317
+ end
2318
+
2319
+ return strToArray(input_function_block.join)
2320
+
2321
+ end
2322
+
2323
+ def compile_multiple_ruby_func_calls(input_file_contents)
2324
+
2325
+ def strToArray(input_string)
2326
+
2327
+ file_id = File.new('hello.nila','w')
2328
+
2329
+ file_id.write(input_string)
2330
+
2331
+ file_id.close()
2332
+
2333
+ line_by_line_contents = read_file_line_by_line('hello.nila')
2334
+
2335
+ File.delete(file_id)
2336
+
2337
+ return line_by_line_contents
2338
+
2339
+ end
2340
+
2341
+ def replace_strings(input_string)
2342
+
2343
+ string_counter = 0
2344
+
2345
+ if input_string.count("\"") % 2 == 0
2346
+
2347
+ while input_string.include?("\"")
2348
+
2349
+ string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
2350
+
2351
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
2352
+
2353
+ string_counter += 1
2354
+
2355
+ end
2356
+
2357
+ end
2358
+
2359
+ if input_string.count("'") % 2 == 0
2360
+
2361
+ while input_string.include?("'")
2362
+
2363
+ string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
2364
+
2365
+ input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
2366
+
2367
+ string_counter += 1
2368
+
2369
+ end
2370
+
2371
+ end
2372
+
2373
+ input_string = input_string.gsub(/\((\w{0,},)*\w{0,}\)/,"--$k$")
2374
+
2375
+ return input_string
2376
+
2377
+ end
2378
+
2379
+ function_calls = []
2380
+
2381
+ replacement_calls = []
2382
+
2383
+ function_map = %w{puts p print}
2384
+
2385
+ javascript_regexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
2386
+
2387
+ stringified_input = input_file_contents.collect {|element| replace_strings(element)}
2388
+
2389
+ function_map.each do |func|
2390
+
2391
+ func_calls = input_file_contents.reject {|line| !(line.include?(func+"(") or line.include?(func+" ") and line.index(javascript_regexp) == nil)}
2392
+
2393
+ modified_func_calls = func_calls.collect {|element| replace_strings(element)}
2394
+
2395
+ modified_func_calls = modified_func_calls.reject {|element| !element.include?(",")}
2396
+
2397
+ call_collector = []
2398
+
2399
+ modified_func_calls.each_with_index do |ele|
2400
+
2401
+ call_collector << input_file_contents[stringified_input.index(ele)]
2402
+
2403
+ end
2404
+
2405
+ function_calls << modified_func_calls
2406
+
2407
+ rep_calls = []
2408
+
2409
+ call_collector.each do |fcall|
2410
+
2411
+ multiple_call = fcall.split(func)[1].split(",")
2412
+
2413
+ multiple_call = multiple_call.collect {|element| "\n#{func} " + element.strip + "\n\n"}
2414
+
2415
+ rep_calls << multiple_call.join
2416
+
2417
+ end
2418
+
2419
+ replacement_calls << rep_calls
2420
+
2421
+ end
2422
+
2423
+ replacement_calls = replacement_calls.flatten
2424
+
2425
+ function_calls = function_calls.flatten
2426
+
2427
+ function_calls.each_with_index do |fcall,index|
2428
+
2429
+ input_file_contents[stringified_input.index(fcall)] = replacement_calls[index]
2430
+
2431
+ end
2432
+
2433
+ return strToArray(input_file_contents.join)
2434
+
2435
+ end
2436
+
2149
2437
  joined_file_contents = input_file_contents.join
2150
2438
 
2151
2439
  unless named_code_blocks.empty?
@@ -2188,7 +2476,7 @@ def compile(input_file_path, *output_file_name)
2188
2476
 
2189
2477
  file_id.close()
2190
2478
 
2191
- line_by_line_contents = read_file_line_by_line(temporary_nila_file)
2479
+ line_by_line_contents = compile_multiple_ruby_func_calls(read_file_line_by_line(temporary_nila_file))
2192
2480
 
2193
2481
  return line_by_line_contents, function_names
2194
2482
 
@@ -2444,6 +2732,8 @@ def compile(input_file_path, *output_file_name)
2444
2732
 
2445
2733
  modified_string = modified_string.sub(function+" ", function+"(")
2446
2734
 
2735
+ modified_string = modified_string.split("#{function}(")[0] + "#{function}(" + modified_string.split("#{function}(")[1].lstrip
2736
+
2447
2737
  modified_string = modified_string.sub("\n", ")\n")
2448
2738
 
2449
2739
  joined_file_contents = joined_file_contents.sub(string, modified_string)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nilac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4.3.9.1
4
+ version: 0.0.4.3.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adhithya Rajasekaran
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-06 00:00:00.000000000 Z
11
+ date: 2013-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shark
@@ -76,6 +76,7 @@ files:
76
76
  - shark/features/regular_while.feature
77
77
  - shark/features/ruby_methods.feature
78
78
  - shark/features/ruby_operators.feature
79
+ - shark/features/splats.feature
79
80
  - shark/features/string_interpolation.feature
80
81
  - shark/features/strings.feature
81
82
  - shark/features/times.feature
@@ -102,6 +103,7 @@ files:
102
103
  - shark/test_files/correct_return.js
103
104
  - shark/test_files/correct_ruby_methods.js
104
105
  - shark/test_files/correct_single_return.js
106
+ - shark/test_files/correct_splats.js
105
107
  - shark/test_files/correct_string_interpolation.js
106
108
  - shark/test_files/correct_string_operators.js
107
109
  - shark/test_files/correct_times.js
@@ -126,6 +128,7 @@ files:
126
128
  - shark/test_files/ruby_methods.nila
127
129
  - shark/test_files/simple.nila
128
130
  - shark/test_files/single_return.nila
131
+ - shark/test_files/splats.nila
129
132
  - shark/test_files/string_interpolation.nila
130
133
  - shark/test_files/string_operators.nila
131
134
  - shark/test_files/times.nila