@@ -1677,6 +1677,83 @@ describe('Lexer: Third Milestone', function() {
1677
1677
expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1678
1678
} ) ;
1679
1679
1680
+ xit ( 'should handle functions that take a function specified with parentheses around an argument and parenthesis' , function ( ) {
1681
+ input = String . raw `func any(list: [Int], condition: ((Int,String,Bool) -> Bool)) -> Bool {
1682
+ for item in list {
1683
+ if condition(item,"abc",true) {
1684
+ return true
1685
+ }
1686
+ }
1687
+ return false
1688
+ }` ;
1689
+ output = [
1690
+ { type : "DECLARATION_KEYWORD" , value : "func" } ,
1691
+ { type : "IDENTIFIER" , value : "any" } ,
1692
+ { type : "PARAMS_START" , value : "(" } ,
1693
+ { type : "IDENTIFIER" , value : "list" } ,
1694
+ { type : "PUNCTUATION" , value : ":" } ,
1695
+ { type : "ARRAY_START" , value : "[" } ,
1696
+ { type : "TYPE_NUMBER" , value : "Int" } ,
1697
+ { type : "ARRAY_END" , value : "]" } ,
1698
+ { type : "PUNCTUATION" , value : "," } ,
1699
+ { type : "IDENTIFIER" , value : "condition" } ,
1700
+ { type : "PUNCTUATION" , value : ":" } ,
1701
+ { type : "PUNCTUATION" , value : "(" } ,
1702
+ { type : "PARAMS_START" , value : "(" } ,
1703
+ { type : "TYPE_NUMBER" , value : "Int" } ,
1704
+ { type : "PUNCTUATION" , value : "," } ,
1705
+ { type : "TYPE_STRING" , value : "String" } ,
1706
+ { type : "PUNCTUATION" , value : "," } ,
1707
+ { type : "TYPE_BOOLEAN" , value : "Bool" } ,
1708
+ { type : "PARAMS_END" , value : ")" } ,
1709
+ { type : "RETURN_ARROW" , value : "->" } ,
1710
+ { type : "TYPE_BOOLEAN" , value : "Bool" } ,
1711
+ { type : "PUNCTUATION" , value : ")" } ,
1712
+ { type : "PARAMS_END" , value : ")" } ,
1713
+ { type : "RETURN_ARROW" , value : "->" } ,
1714
+ { type : "TYPE_BOOLEAN" , value : "Bool" } ,
1715
+ { type : "STATEMENTS_START" , value : "{" } ,
1716
+ { type : "TERMINATOR" , value : "\\n" } ,
1717
+
1718
+ { type : "STATEMENT_KEYWORD" , value : "for" } ,
1719
+ { type : "IDENTIFIER" , value : "item" } ,
1720
+ { type : "STATEMENT_KEYWORD" , value : "in" } ,
1721
+ { type : "IDENTIFIER" , value : "list" } ,
1722
+ { type : "PUNCTUATION" , value : "{" } ,
1723
+ { type : "TERMINATOR" , value : "\\n" } ,
1724
+
1725
+ { type : "STATEMENT_KEYWORD" , value : "if" } ,
1726
+ { type : "IDENTIFIER" , value : "condition" } ,
1727
+ { type : "INVOCATION_START" , value : "(" } ,
1728
+ { type : "IDENTIFIER" , value : "item" } ,
1729
+ { type : "PUNCTUATION" , value : "," } ,
1730
+
1731
+ { type : "PUNCTUATION" , value : "," } ,
1732
+ { type : "BOOLEAN" , value : "true" } ,
1733
+ { type : "INVOCATION_END" , value : ")" } ,
1734
+ { type : "PUNCTUATION" , value : "{" } ,
1735
+ { type : "TERMINATOR" , value : "\\n" } ,
1736
+ { type : "STRING" , value : "abc" } ,
1737
+ { type : "STATEMENT_KEYWORD" , value : "return" } ,
1738
+ { type : "BOOLEAN" , value : "true" } ,
1739
+ { type : "TERMINATOR" , value : "\\n" } ,
1740
+
1741
+ { type : "PUNCTUATION" , value : "}" } ,
1742
+ { type : "TERMINATOR" , value : "\\n" } ,
1743
+
1744
+ { type : "PUNCTUATION" , value : "}" } ,
1745
+ { type : "TERMINATOR" , value : "\\n" } ,
1746
+
1747
+ { type : "STATEMENT_KEYWORD" , value : "return" } ,
1748
+ { type : "BOOLEAN" , value : "false" } ,
1749
+ { type : "TERMINATOR" , value : "\\n" } ,
1750
+
1751
+ { type : "STATEMENTS_END" , value : "}" } ,
1752
+ { type : "TERMINATOR" , value : "EOF" }
1753
+ ] ;
1754
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1755
+ } ) ;
1756
+
1680
1757
it ( 'should handle functions that take a function specified without parentheses as an argument and parenthesis around the return type' , function ( ) {
1681
1758
input = String . raw `func any(list: [Int], condition: (Int) -> Bool) -> (Bool) {
1682
1759
for item in list {
@@ -1806,7 +1883,7 @@ describe('Lexer: Third Milestone', function() {
1806
1883
{ type : 'PARAMS_START' , value : '(' } ,
1807
1884
{ type : 'PARAMS_END' , value : ')' } ,
1808
1885
{ type : 'RETURN_ARROW' , value : '->' } ,
1809
- { type : 'TYPE_STRING ' , value : 'Int' } ,
1886
+ { type : 'TYPE_NUMBER ' , value : 'Int' } ,
1810
1887
{ type : 'STATEMENTS_START' , value : '{' } ,
1811
1888
{ type : 'TERMINATOR' , value : '\\n' } ,
1812
1889
@@ -1990,6 +2067,156 @@ describe('Lexer: Third Milestone', function() {
1990
2067
expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
1991
2068
} ) ;
1992
2069
2070
+ xit ( 'should handle functions that get assigned to a variable and are invoked later' , function ( ) {
2071
+ input = String . raw `func addTwoInts(a: Int, b: Int) -> Int {
2072
+ return a+b
2073
+ }
2074
+
2075
+ var mathFunction: (Int, Int) -> Int = addTwoInts
2076
+
2077
+ print(mathFunction(2,3))` ;
2078
+ output = [
2079
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
2080
+ { type : 'IDENTIFIER' , value : 'addTwoInts' } ,
2081
+ { type : 'PARAMS_START' , value : '(' } ,
2082
+ { type : 'IDENTIFIER' , value : 'a' } ,
2083
+ { type : 'PUNCTUATION' , value : ':' } ,
2084
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2085
+ { type : 'PUNCTUATION' , value : ',' } ,
2086
+ { type : 'IDENTIFIER' , value : 'b' } ,
2087
+ { type : 'PUNCTUATION' , value : ':' } ,
2088
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2089
+ { type : 'PARAMS_END' , value : ')' } ,
2090
+ { type : 'RETURN_ARROW' , value : '->' } ,
2091
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2092
+ { type : 'STATEMENTS_START' , value : '{' } ,
2093
+ { type : 'TERMINATOR' , value : '\\n' } ,
2094
+
2095
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
2096
+ { type : 'IDENTIFIER' , value : 'a' } ,
2097
+ { type : 'OPERATOR' , value : '+' } ,
2098
+ { type : 'IDENTIFIER' , value : 'b' } ,
2099
+ { type : 'TERMINATOR' , value : '\\n' } ,
2100
+
2101
+ { type : 'STATEMENTS_END' , value : '}' } ,
2102
+ { type : 'TERMINATOR' , value : '\\n' } ,
2103
+ { type : 'TERMINATOR' , value : '\\n' } ,
2104
+
2105
+ { type : 'DECLARATION_KEYWORD' , value : 'var' } ,
2106
+ { type : 'IDENTIFIER' , value : 'mathFunction' } ,
2107
+ { type : 'PUNCTUATION' , value : ':' } ,
2108
+ { type : 'PUNCTUATION' , value : '(' } , //TODO make Params_start
2109
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2110
+ { type : 'PUNCTUATION' , value : ',' } ,
2111
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2112
+ { type : 'PUNCTUATION' , value : ')' } , //TODO make Params_end
2113
+ { type : 'OPERATOR' , value : '-' } , // Not correct
2114
+ { type : 'OPERATOR' , value : '>' } ,
2115
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2116
+ { type : 'OPERATOR' , value : '=' } ,
2117
+ { type : 'IDENTIFIER' , value : 'addTwoInts' } , //Need to go backward frmo here to var keyword and modify accordingly
2118
+ { type : 'TERMINATOR' , value : '\\n' } ,
2119
+ { type : 'TERMINATOR' , value : '\\n' } ,
2120
+
2121
+ { type : 'NATIVE_METHOD' , value : 'print' } ,
2122
+ { type : 'INVOCATION_START' , value : '(' } ,
2123
+ { type : 'IDENTIFIER' , value : 'mathFunction' } ,
2124
+ { type : 'PUNCTUATION' , value : '(' } ,
2125
+ { type : 'NUMBER' , value : '2' } ,
2126
+ { type : 'PUNCTUATION' , value : ',' } ,
2127
+ { type : 'NUMBER' , value : '3' } ,
2128
+ { type : 'PUNCTUATION' , value : ')' } ,
2129
+ { type : 'INVOCATION_END' , value : ')' } ,
2130
+ { type : 'TERMINATOR' , value : 'EOF' }
2131
+ ] ;
2132
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
2133
+ } ) ;
2134
+
2135
+ it ( 'should handle functions that return nil when the input is invalid' , function ( ) {
2136
+ input = String . raw `func giveTwoValuesIfNumberGreaterThan5(input: Int) -> (one: Int, two: Int)? {
2137
+ if input > 5 {
2138
+ return (input+1,input-1)
2139
+ } else {
2140
+ return nil
2141
+ }
2142
+ }
2143
+
2144
+ giveTwoValuesIfNumberGreaterThan5(6)
2145
+ giveTwoValuesIfNumberGreaterThan5(4)` ;
2146
+ output = [
2147
+ { type : 'DECLARATION_KEYWORD' , value : 'func' } ,
2148
+ { type : 'IDENTIFIER' , value : 'giveTwoValuesIfNumberGreaterThan5' } ,
2149
+ { type : 'PARAMS_START' , value : '(' } ,
2150
+ { type : 'IDENTIFIER' , value : 'input' } ,
2151
+ { type : 'PUNCTUATION' , value : ':' } ,
2152
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2153
+ { type : 'PARAMS_END' , value : ')' } ,
2154
+ { type : 'RETURN_ARROW' , value : '->' } ,
2155
+ { type : 'TUPLE_START' , value : '(' } ,
2156
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'one' } ,
2157
+ { type : 'PUNCTUATION' , value : ':' } ,
2158
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2159
+ { type : 'PUNCTUATION' , value : ',' } ,
2160
+ { type : 'TUPLE_ELEMENT_NAME' , value : 'two' } ,
2161
+ { type : 'PUNCTUATION' , value : ':' } ,
2162
+ { type : 'TYPE_NUMBER' , value : 'Int' } ,
2163
+ { type : 'TUPLE_END' , value : ')' } ,
2164
+ { type : 'OPERATOR' , value : '?' } ,
2165
+ { type : 'STATEMENTS_START' , value : '{' } ,
2166
+ { type : 'TERMINATOR' , value : '\\n' } ,
2167
+
2168
+ { type : 'STATEMENT_KEYWORD' , value : 'if' } ,
2169
+ { type : 'IDENTIFIER' , value : 'input' } ,
2170
+ { type : 'OPERATOR' , value : '>' } ,
2171
+ { type : 'NUMBER' , value : '5' } ,
2172
+ { type : 'PUNCTUATION' , value : '{' } ,
2173
+ { type : 'TERMINATOR' , value : '\\n' } ,
2174
+
2175
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
2176
+ { type : 'TUPLE_START' , value : '(' } ,
2177
+ { type : 'IDENTIFIER' , value : 'input' } ,
2178
+ { type : 'OPERATOR' , value : '+' } ,
2179
+ { type : 'NUMBER' , value : '1' } ,
2180
+ { type : 'PUNCTUATION' , value : ',' } ,
2181
+ { type : 'IDENTIFIER' , value : 'input' } ,
2182
+ { type : 'OPERATOR' , value : '-' } ,
2183
+ { type : 'NUMBER' , value : '1' } ,
2184
+ { type : 'TUPLE_END' , value : ')' } ,
2185
+ { type : 'TERMINATOR' , value : '\\n' } ,
2186
+
2187
+ { type : 'PUNCTUATION' , value : '}' } ,
2188
+ { type : 'STATEMENT_KEYWORD' , value : 'else' } ,
2189
+ { type : 'PUNCTUATION' , value : '{' } ,
2190
+ { type : 'TERMINATOR' , value : '\\n' } ,
2191
+
2192
+ { type : 'STATEMENT_KEYWORD' , value : 'return' } ,
2193
+ { type : 'EXPRESSION_OR_TYPE_KEYWORD' , value : 'nil' } ,
2194
+ { type : 'TERMINATOR' , value : '\\n' } ,
2195
+
2196
+ { type : 'PUNCTUATION' , value : '}' } ,
2197
+ { type : 'TERMINATOR' , value : '\\n' } ,
2198
+
2199
+ { type : 'STATEMENTS_END' , value : '}' } ,
2200
+ { type : 'TERMINATOR' , value : '\\n' } ,
2201
+ { type : 'TERMINATOR' , value : '\\n' } ,
2202
+
2203
+ { type : 'IDENTIFIER' ,
2204
+ value : 'giveTwoValuesIfNumberGreaterThan5' } ,
2205
+ { type : 'INVOCATION_START' , value : '(' } ,
2206
+ { type : 'NUMBER' , value : '6' } ,
2207
+ { type : 'INVOCATION_END' , value : ')' } ,
2208
+ { type : 'TERMINATOR' , value : '\\n' } ,
2209
+
2210
+ { type : 'IDENTIFIER' ,
2211
+ value : 'giveTwoValuesIfNumberGreaterThan5' } ,
2212
+ { type : 'INVOCATION_START' , value : '(' } ,
2213
+ { type : 'NUMBER' , value : '4' } ,
2214
+ { type : 'INVOCATION_END' , value : ')' } ,
2215
+ { type : 'TERMINATOR' , value : 'EOF' }
2216
+ ] ;
2217
+ expect ( lexer ( input ) ) . to . deep . equal ( output ) ;
2218
+ } ) ;
2219
+
1993
2220
it ( 'should handle functions that use inputs, native methods, string interpolation, and ? operator in parameters and nil input to function invocation' , function ( ) {
1994
2221
input = String . raw `func printFirstName(firstName:String,surname:String?) {
1995
2222
if let unwrappedSurname = surname {
0 commit comments