diff --git a/swift/swift5/Cpp/SwiftSupport.cpp b/swift/swift5/Cpp/SwiftSupport.cpp index 56e5ef7535..200e5a1971 100644 --- a/swift/swift5/Cpp/SwiftSupport.cpp +++ b/swift/swift5/Cpp/SwiftSupport.cpp @@ -146,8 +146,8 @@ SwiftSupport::OperatorCharacter::OperatorCharacter() SwiftSupport::LeftWS::LeftWS() { set(Swift5Parser::WS); set(Swift5Parser::LPAREN); - set(Swift5Parser::Interpolataion_multi_line); - set(Swift5Parser::Interpolataion_single_line); + set(Swift5Parser::Interpolation_multi_line); + set(Swift5Parser::Interpolation_single_line); set(Swift5Parser::LBRACK); set(Swift5Parser::LCURLY); set(Swift5Parser::COMMA); @@ -248,6 +248,10 @@ bool SwiftSupport::isBinaryOp(antlr4::TokenStream* tokens) { bool nextIsWS = isRightOperatorWS(nextToken); //String text = tokens.getText(Interval.of(start, stop)); //System.out.println("isBinaryOp: '"+prevToken+"','"+text+"','"+nextToken+"' is "+result); + // accept only '??'' as binary operator + if (currentToken->getType() == Swift5Lexer::QUESTION && start == stop) { + return false; + } if (prevIsWS) { return nextIsWS; } else { diff --git a/swift/swift5/Java/SwiftSupport.java b/swift/swift5/Java/SwiftSupport.java index 952516a85c..878c055f0a 100644 --- a/swift/swift5/Java/SwiftSupport.java +++ b/swift/swift5/Java/SwiftSupport.java @@ -133,8 +133,8 @@ To use it in the ternary conditional (? :) operator, it must have leftWS.set(Swift5Parser.WS); leftWS.set(Swift5Parser.LPAREN); - leftWS.set(Swift5Parser.Interpolataion_multi_line); - leftWS.set(Swift5Parser.Interpolataion_single_line); + leftWS.set(Swift5Parser.Interpolation_multi_line); + leftWS.set(Swift5Parser.Interpolation_single_line); leftWS.set(Swift5Parser.LBRACK); leftWS.set(Swift5Parser.LCURLY); leftWS.set(Swift5Parser.COMMA); @@ -252,6 +252,10 @@ public static boolean isBinaryOp(TokenStream tokens) { boolean nextIsWS = isRightOperatorWS(nextToken); //String text = tokens.getText(Interval.of(start, stop)); //System.out.println("isBinaryOp: '"+prevToken+"','"+text+"','"+nextToken+"' is "+result); + // accept only '??'' as binary operator + if (currentToken.getType() == Swift5Lexer.QUESTION && start == stop) { + return false; + } if (prevIsWS) { return nextIsWS; } else { diff --git a/swift/swift5/Swift5Lexer.g4 b/swift/swift5/Swift5Lexer.g4 index a4622936ec..ba66caf004 100644 --- a/swift/swift5/Swift5Lexer.g4 +++ b/swift/swift5/Swift5Lexer.g4 @@ -151,6 +151,8 @@ HASH_IMAGE_LITERAL : '#imageLiteral'; GETTER : 'getter'; SETTER : 'setter'; +UNDERSCORE : '_'; + Identifier: Identifier_head Identifier_characters? | Implicit_parameter_name @@ -249,7 +251,6 @@ COLON : ':'; SEMI : ';'; LT : '<'; GT : '>'; -UNDERSCORE : '_'; BANG : '!'; QUESTION : '?'; AT : '@'; @@ -346,7 +347,7 @@ Single_line_string_open: '"' -> pushMode(SingleLine); mode SingleLine; -Interpolataion_single_line: '\\(' { parenthesis.push(1);} -> pushMode(DEFAULT_MODE); +Interpolation_single_line: '\\(' { parenthesis.push(1);} -> pushMode(DEFAULT_MODE); Single_line_string_close: '"' -> popMode; @@ -354,7 +355,7 @@ Quoted_single_line_text: Quoted_text; mode MultiLine; -Interpolataion_multi_line: '\\(' {parenthesis.push(1); } -> pushMode(DEFAULT_MODE); +Interpolation_multi_line: '\\(' {parenthesis.push(1); } -> pushMode(DEFAULT_MODE); Multi_line_string_close: '"""' -> popMode; diff --git a/swift/swift5/Swift5Parser.g4 b/swift/swift5/Swift5Parser.g4 index 9f6f930fdb..e43b7cd375 100644 --- a/swift/swift5/Swift5Parser.g4 +++ b/swift/swift5/Swift5Parser.g4 @@ -1186,7 +1186,7 @@ closure_parameter_list ; closure_parameter - : closure_parameter_name = identifier (type_annotation range_operator?)? + : UNDERSCORE? closure_parameter_name = identifier (type_annotation range_operator?)? ; capture_list @@ -1326,7 +1326,7 @@ forced_value_suffix ; optional_chaining_suffix - : {!this.isBinaryOp(_input)}? QUESTION + : {!this.isBinaryOp(_input) && _input.get(_input.index()-1).getType()!=WS}? QUESTION ; // Function Call Expression @@ -1565,6 +1565,7 @@ identifier | SELF_BIG | SET | CLASS + | STRUCT | GETTER | SETTER | OPERATOR @@ -1573,6 +1574,7 @@ identifier ) | Identifier | BACKTICK (keyword | Identifier | DOLLAR) BACKTICK + | UNDERSCORE ; identifier_list @@ -1810,10 +1812,10 @@ static_string_literal interpolated_string_literal : Single_line_string_open ( Quoted_single_line_text - | Interpolataion_single_line (expression | tuple_element COMMA tuple_element_list) RPAREN + | Interpolation_single_line (expression | tuple_element COMMA tuple_element_list) RPAREN )* Single_line_string_close | Multi_line_string_open ( Quoted_multi_line_text - | Interpolataion_multi_line (expression | tuple_element COMMA tuple_element_list) RPAREN + | Interpolation_multi_line (expression | tuple_element COMMA tuple_element_list) RPAREN )* Multi_line_string_close ; \ No newline at end of file diff --git a/swift/swift5/examples/Functions and Closures/Contents.swift b/swift/swift5/examples/Functions and Closures/Contents.swift index 413e350839..4a659ea9fc 100644 --- a/swift/swift5/examples/Functions and Closures/Contents.swift +++ b/swift/swift5/examples/Functions and Closures/Contents.swift @@ -98,6 +98,27 @@ print(mappedNumbers) let sortedNumbers = numbers.sorted { $0 > $1 } print(sortedNumbers) +// : Accepts trailing closure with 2 string parameters and call it +func printTwoStrings(_ closure: (String, String) -> Void) { + closure("Hello", "World") +} + +//: Closure parameter name with an underscore before (closures don't have external parameter names, but underscore is allowed) +printTwoStrings { (_ x: String, _ y: String) in + print(x, y) +} + +// : Accepts 'struct' as external parameter name +public func create(struct s: T) { + print(s) +} + +create(struct: 1) + +// : Return expression with two QUESTION tokens +public func GetString(_ s: T, _ val: Int) -> String? { + return val == 0 ? s as? String : nil +} //: [Previous](@previous) | [Next](@next) \ No newline at end of file