@@ -1677,6 +1677,251 @@ describe('Lexer: Third Milestone', function() {
1677
1677
expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1678
1678
} ) ;
1679
1679
1680
+ it ( 'should handle functions that have external and internal parameter names and have a void return type' , function ( ) {
1681
+ input = String . raw `func sayHelloNoOutput(to person: String, from anotherPerson: String) {
1682
+ print("To \(person) from \(anotherPerson)!")
1683
+ }
1684
+
1685
+ sayHelloNoOutput(to: "Bill", from: "Ted")` ;
1686
+ output = [
1687
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
1688
+ { type : 'IDENTIFIER' , value : 'sayHelloNoOutput' } ,
1689
+ { type : 'PARAMS_START' , value : '(' } ,
1690
+ { type : 'IDENTIFIER' , value : 'to' } ,
1691
+ { type : 'IDENTIFIER' , value : 'person' } ,
1692
+ { type : 'PUNCTUATION' , value : ':' } ,
1693
+ { type : 'TYPE_STRING' , value : 'String' } ,
1694
+ { type : 'PUNCTUATION' , value : ',' } ,
1695
+ { type : 'IDENTIFIER' , value : 'from' } ,
1696
+ { type : 'IDENTIFIER' , value : 'anotherPerson' } ,
1697
+ { type : 'PUNCTUATION' , value : ':' } ,
1698
+ { type : 'TYPE_STRING' , value : 'String' } ,
1699
+ { type : 'PARAMS_END' , value : ')' } ,
1700
+ { type : 'STATEMENTS_START' , value : '{' } ,
1701
+ { type : 'TERMINATOR' , value : '\\n' } ,
1702
+
1703
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
1704
+ { type : 'INVOCATION_START' , value : '(' } ,
1705
+ { type : 'STRING' , value : 'To ' } ,
1706
+ { type : 'STRING_INTERPOLATION_START' , value : '\\(' } ,
1707
+ { type : 'IDENTIFIER' , value : 'person' } ,
1708
+ { type : 'STRING_INTERPOLATION_END' , value : ')' } ,
1709
+ { type : 'STRING' , value : ' from ' } ,
1710
+ { type : 'STRING_INTERPOLATION_START' , value : '\\(' } ,
1711
+ { type : 'IDENTIFIER' , value : 'anotherPerson' } ,
1712
+ { type : 'STRING_INTERPOLATION_END' , value : ')' } ,
1713
+ { type : 'STRING' , value : '!' } ,
1714
+ { type : 'INVOCATION_END' , value : ')' } ,
1715
+ { type : 'TERMINATOR' , value : '\\n' } ,
1716
+
1717
+ { type : 'STATEMENTS_END' , value : '}' } ,
1718
+ { type : 'TERMINATOR' , value : '\\n' } ,
1719
+ { type : 'TERMINATOR' , value : '\\n' } ,
1720
+
1721
+ { type : 'IDENTIFIER' , value : 'sayHelloNoOutput' } ,
1722
+ { type : 'INVOCATION_START' , value : '(' } ,
1723
+ { type : 'IDENTIFIER' , value : 'to' } ,
1724
+ { type : 'PUNCTUATION' , value : ':' } ,
1725
+ { type : 'STRING' , value : 'Bill' } ,
1726
+ { type : 'PUNCTUATION' , value : ',' } ,
1727
+ { type : 'IDENTIFIER' , value : 'from' } ,
1728
+ { type : 'PUNCTUATION' , value : ':' } ,
1729
+ { type : 'STRING' , value : 'Ted' } ,
1730
+ { type : 'INVOCATION_END' , value : ')' } ,
1731
+ { type : 'TERMINATOR' , value : 'EOF' }
1732
+ ] ;
1733
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1734
+ } ) ;
1735
+
1736
+ it ( 'should handle functions that have external and internal parameter names and have a string return type' , function ( ) {
1737
+ input = String . raw `func sayHello(to person: String, from anotherPerson: String) -> String {
1738
+ return "To \(person) from \(anotherPerson)"
1739
+ }
1740
+ print(sayHello(to: "Bill", from: "Ted"))` ;
1741
+ output = [
1742
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
1743
+ { type : 'IDENTIFIER' , value : 'sayHello' } ,
1744
+ { type : 'PARAMS_START' , value : '(' } ,
1745
+ { type : 'IDENTIFIER' , value : 'to' } ,
1746
+ { type : 'IDENTIFIER' , value : 'person' } ,
1747
+ { type : 'PUNCTUATION' , value : ':' } ,
1748
+ { type : 'TYPE_STRING' , value : 'String' } ,
1749
+ { type : 'PUNCTUATION' , value : ',' } ,
1750
+ { type : 'IDENTIFIER' , value : 'from' } ,
1751
+ { type : 'IDENTIFIER' , value : 'anotherPerson' } ,
1752
+ { type : 'PUNCTUATION' , value : ':' } ,
1753
+ { type : 'TYPE_STRING' , value : 'String' } ,
1754
+ { type : 'PARAMS_END' , value : ')' } ,
1755
+ { type : 'RETURN_ARROW' , value : '->' } ,
1756
+ { type : 'TYPE_STRING' , value : 'String' } ,
1757
+ { type : 'STATEMENTS_START' , value : '{' } ,
1758
+ { type : 'TERMINATOR' , value : '\\n' } ,
1759
+
1760
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
1761
+ { type : 'STRING' , value : 'To ' } ,
1762
+ { type : 'STRING_INTERPOLATION_START' , value : '\\(' } ,
1763
+ { type : 'IDENTIFIER' , value : 'person' } ,
1764
+ { type : 'STRING_INTERPOLATION_END' , value : ')' } ,
1765
+ { type : 'STRING' , value : ' from ' } ,
1766
+ { type : 'STRING_INTERPOLATION_START' , value : '\\(' } ,
1767
+ { type : 'IDENTIFIER' , value : 'anotherPerson' } ,
1768
+ { type : 'STRING_INTERPOLATION_END' , value : ')' } ,
1769
+ { type : 'STRING' , value : '' } ,
1770
+ { type : 'TERMINATOR' , value : '\\n' } ,
1771
+
1772
+ { type : 'STATEMENTS_END' , value : '}' } ,
1773
+ { type : 'TERMINATOR' , value : '\\n' } ,
1774
+
1775
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
1776
+ { type : 'INVOCATION_START' , value : '(' } ,
1777
+ { type : 'IDENTIFIER' , value : 'sayHello' } ,
1778
+ { type : 'INVOCATION_START' , value : '(' } ,
1779
+ { type : 'IDENTIFIER' , value : 'to' } ,
1780
+ { type : 'PUNCTUATION' , value : ':' } ,
1781
+ { type : 'STRING' , value : 'Bill' } ,
1782
+ { type : 'PUNCTUATION' , value : ',' } ,
1783
+ { type : 'IDENTIFIER' , value : 'from' } ,
1784
+ { type : 'PUNCTUATION' , value : ':' } ,
1785
+ { type : 'STRING' , value : 'Ted' } ,
1786
+ { type : 'INVOCATION_END' , value : ')' } ,
1787
+ { type : 'INVOCATION_END' , value : ')' } ,
1788
+ { type : 'TERMINATOR' , value : 'EOF' }
1789
+ ] ;
1790
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1791
+ } ) ;
1792
+
1793
+ it ( 'should handle functions that return a dictionary type' , function ( ) {
1794
+ input = String . raw `func dictionary() -> [String: Int] {
1795
+ return ["one":1,"two":2,"three":3,"four":4,"five":5]
1796
+ }` ;
1797
+ output = [
1798
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
1799
+ { type : 'IDENTIFIER' , value : 'dictionary' } ,
1800
+ { type : 'PARAMS_START' , value : '(' } ,
1801
+ { type : 'PARAMS_END' , value : ')' } ,
1802
+ { type : 'RETURN_ARROW' , value : '->' } ,
1803
+ { type : 'DICTIONARY_START' , value : '[' } ,
1804
+ { type : 'TYPE_STRING' , value : 'String' } ,
1805
+ { type : 'PUNCTUATION' , value : ':' } ,
1806
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
1807
+ { type : 'DICTIONARY_END' , value : ']' } ,
1808
+ { type : 'STATEMENTS_START' , value : '{' } ,
1809
+ { type : 'TERMINATOR' , value : '\\n' } ,
1810
+
1811
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
1812
+ { type : 'DICTIONARY_START' , value : '[' } ,
1813
+ { type : 'STRING' , value : 'one' } ,
1814
+ { type : 'PUNCTUATION' , value : ':' } ,
1815
+ { type : 'NUMBER' , value : '1' } ,
1816
+ { type : 'PUNCTUATION' , value : ',' } ,
1817
+ { type : 'STRING' , value : 'two' } ,
1818
+ { type : 'PUNCTUATION' , value : ':' } ,
1819
+ { type : 'NUMBER' , value : '2' } ,
1820
+ { type : 'PUNCTUATION' , value : ',' } ,
1821
+ { type : 'STRING' , value : 'three' } ,
1822
+ { type : 'PUNCTUATION' , value : ':' } ,
1823
+ { type : 'NUMBER' , value : '3' } ,
1824
+ { type : 'PUNCTUATION' , value : ',' } ,
1825
+ { type : 'STRING' , value : 'four' } ,
1826
+ { type : 'PUNCTUATION' , value : ':' } ,
1827
+ { type : 'NUMBER' , value : '4' } ,
1828
+ { type : 'PUNCTUATION' , value : ',' } ,
1829
+ { type : 'STRING' , value : 'five' } ,
1830
+ { type : 'PUNCTUATION' , value : ':' } ,
1831
+ { type : 'NUMBER' , value : '5' } ,
1832
+ { type : 'DICTIONARY_END' , value : ']' } ,
1833
+ { type : 'TERMINATOR' , value : '\\n' } ,
1834
+
1835
+ { type : 'STATEMENTS_END' , value : '}' } ,
1836
+ { type : 'TERMINATOR' , value : 'EOF' }
1837
+ ] ;
1838
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1839
+ } ) ;
1840
+
1841
+ it ( 'should handle functions that return an array type' , function ( ) {
1842
+ input = String . raw `func array() -> [Int] {
1843
+ return [1,2,3,4,5]
1844
+ }` ;
1845
+ output = [
1846
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
1847
+ { type : 'IDENTIFIER' , value : 'array' } ,
1848
+ { type : 'PARAMS_START' , value : '(' } ,
1849
+ { type : 'PARAMS_END' , value : ')' } ,
1850
+ { type : 'RETURN_ARROW' , value : '->' } ,
1851
+ { type : 'ARRAY_START' , value : '[' } ,
1852
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
1853
+ { type : 'ARRAY_END' , value : ']' } ,
1854
+ { type : 'STATEMENTS_START' , value : '{' } ,
1855
+ { type : 'TERMINATOR' , value : '\\n' } ,
1856
+
1857
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
1858
+ { type : 'ARRAY_START' , value : '[' } ,
1859
+ { type : 'NUMBER' , value : '1' } ,
1860
+ { type : 'PUNCTUATION' , value : ',' } ,
1861
+ { type : 'NUMBER' , value : '2' } ,
1862
+ { type : 'PUNCTUATION' , value : ',' } ,
1863
+ { type : 'NUMBER' , value : '3' } ,
1864
+ { type : 'PUNCTUATION' , value : ',' } ,
1865
+ { type : 'NUMBER' , value : '4' } ,
1866
+ { type : 'PUNCTUATION' , value : ',' } ,
1867
+ { type : 'NUMBER' , value : '5' } ,
1868
+ { type : 'ARRAY_END' , value : ']' } ,
1869
+ { type : 'TERMINATOR' , value : '\\n' } ,
1870
+
1871
+ { type : 'STATEMENTS_END' , value : '}' } ,
1872
+ { type : 'TERMINATOR' , value : 'EOF' }
1873
+ ] ;
1874
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1875
+ } ) ;
1876
+
1877
+ it ( 'should handle functions that accept dictionaries as inputs' , function ( ) {
1878
+ input = String . raw `func abc(a: [String: Int]) {
1879
+ print(a)
1880
+ }
1881
+
1882
+ abc(["one":1,"two":2])` ;
1883
+ output = [
1884
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
1885
+ { type : 'IDENTIFIER' , value : 'abc' } ,
1886
+ { type : 'PARAMS_START' , value : '(' } ,
1887
+ { type : 'IDENTIFIER' , value : 'a' } ,
1888
+ { type : 'PUNCTUATION' , value : ':' } ,
1889
+ { type : 'DICTIONARY_START' , value : '[' } ,
1890
+ { type : 'TYPE_STRING' , value : 'String' } ,
1891
+ { type : 'PUNCTUATION' , value : ':' } ,
1892
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
1893
+ { type : 'DICTIONARY_END' , value : ']' } ,
1894
+ { type : 'PARAMS_END' , value : ')' } ,
1895
+ { type : 'STATEMENTS_START' , value : '{' } ,
1896
+ { type : 'TERMINATOR' , value : '\\n' } ,
1897
+
1898
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
1899
+ { type : 'INVOCATION_START' , value : '(' } ,
1900
+ { type : 'IDENTIFIER' , value : 'a' } ,
1901
+ { type : 'INVOCATION_END' , value : ')' } ,
1902
+ { type : 'TERMINATOR' , value : '\\n' } ,
1903
+
1904
+ { type : 'STATEMENTS_END' , value : '}' } ,
1905
+ { type : 'TERMINATOR' , value : '\\n' } ,
1906
+ { type : 'TERMINATOR' , value : '\\n' } ,
1907
+
1908
+ { type : 'IDENTIFIER' , value : 'abc' } ,
1909
+ { type : 'INVOCATION_START' , value : '(' } ,
1910
+ { type : 'DICTIONARY_START' , value : '[' } ,
1911
+ { type : 'STRING' , value : 'one' } ,
1912
+ { type : 'PUNCTUATION' , value : ':' } ,
1913
+ { type : 'NUMBER' , value : '1' } ,
1914
+ { type : 'PUNCTUATION' , value : ',' } ,
1915
+ { type : 'STRING' , value : 'two' } ,
1916
+ { type : 'PUNCTUATION' , value : ':' } ,
1917
+ { type : 'NUMBER' , value : '2' } ,
1918
+ { type : 'DICTIONARY_END' , value : ']' } ,
1919
+ { type : 'INVOCATION_END' , value : ')' } ,
1920
+ { type : 'TERMINATOR' , value : 'EOF' }
1921
+ ] ;
1922
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1923
+ } ) ;
1924
+
1680
1925
xit ( 'should handle functions that take a function specified with parentheses around an argument and parenthesis' , function ( ) {
1681
1926
input = String . raw `func any(list: [Int], condition: ((Int,String,Bool) -> Bool)) -> Bool {
1682
1927
for item in list {
@@ -2217,6 +2462,69 @@ describe('Lexer: Third Milestone', function() {
2217
2462
expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
2218
2463
} ) ;
2219
2464
2465
+ xit ( 'should handle functions that has an internal parameter that takes in a tuple and prints out the elements of that tuple ' , function ( ) {
2466
+ input = String . raw `func ab(a: (plusFive: Int, timesFive: Int)) {
2467
+ print(a.plusFive)
2468
+ print(a.timesFive)
2469
+ }
2470
+
2471
+ ab((plusFive: 6, timesFive: 8))` ;
2472
+ output = [
2473
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
2474
+ { type : 'IDENTIFIER' , value : 'ab' } ,
2475
+ { type : 'PARAMS_START' , value : '(' } ,
2476
+ { type : 'IDENTIFIER' , value : 'a' } ,
2477
+ { type : 'PUNCTUATION' , value : ':' } ,
2478
+ { type : 'TUPLE_START' , value : '(' } ,
2479
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'plusFive' } ,
2480
+ { type : 'PUNCTUATION' , value : ':' } ,
2481
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2482
+ { type : 'PUNCTUATION' , value : ',' } ,
2483
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'timesFive' } ,
2484
+ { type : 'PUNCTUATION' , value : ':' } ,
2485
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2486
+ { type : 'TUPLE_END' , value : ')' } ,
2487
+ { type : 'PARAMS_START' , value : ')' } ,
2488
+ { type : 'STATEMENTS_START' , value : '{' } ,
2489
+ { type : 'TERMINATOR' , value : '\\n' } ,
2490
+
2491
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
2492
+ { type : 'INVOCATION_START' , value : '(' } ,
2493
+ { type : 'IDENTIFIER' , value : 'a' } ,
2494
+ { type : 'DOT_SYNTAX' , value : '.' } ,
2495
+ { type : 'IDENTIFIER' , value : 'plusFive' } ,
2496
+ { type : 'INVOCATION_END' , value : ')' } ,
2497
+ { type : 'TERMINATOR' , value : '\\n' } ,
2498
+
2499
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
2500
+ { type : 'INVOCATION_START' , value : '(' } ,
2501
+ { type : 'IDENTIFIER' , value : 'a' } ,
2502
+ { type : 'DOT_SYNTAX' , value : '.' } ,
2503
+ { type : 'IDENTIFIER' , value : 'timesFive' } ,
2504
+ { type : 'INVOCATION_END' , value : ')' } ,
2505
+ { type : 'TERMINATOR' , value : '\\n' } ,
2506
+
2507
+ { type : 'STATEMENTS_END' , value : '}' } ,
2508
+ { type : 'TERMINATOR' , value : '\\n' } ,
2509
+ { type : 'TERMINATOR' , value : '\\n' } ,
2510
+
2511
+ { type : 'IDENTIFIER' , value : 'ab' } ,
2512
+ { type : 'INVOCATION_START' , value : '(' } ,
2513
+ { type : 'TUPLE_START' , value : '(' } ,
2514
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'plusFive' } ,
2515
+ { type : 'PUNCTUATION' , value : ':' } ,
2516
+ { type : 'NUMBER' , value : '6' } ,
2517
+ { type : 'PUNCTUATION' , value : ',' } ,
2518
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'timesFive' } ,
2519
+ { type : 'PUNCTUATION' , value : ':' } ,
2520
+ { type : 'NUMBER' , value : '8' } ,
2521
+ { type : 'TUPLE_END' , value : ')' } ,
2522
+ { type : 'INVOCATION_END' , value : ')' } ,
2523
+ { type : 'TERMINATOR' , value : 'EOF' }
2524
+ ] ;
2525
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
2526
+ } ) ;
2527
+
2220
2528
it ( 'should handle functions that use inputs, native methods, string interpolation, and ? operator in parameters and nil input to function invocation' , function ( ) {
2221
2529
input = String . raw `func printFirstName(firstName:String,surname:String?) {
2222
2530
if let unwrappedSurname = surname {
0 commit comments