2
0
Эх сурвалжийг харах

Lex dot-idents for `#if`/`#elseif` conditionals (#8353)

* [parser] lex dot idents

* ensure proper identifiers in dotted tokens
Simon Krajewski 6 жил өмнө
parent
commit
e98ef78912

+ 20 - 0
src/syntax/lexer.ml

@@ -277,6 +277,18 @@ let ident = [%sedlex.regexp?
 	)
 ]
 
+let sharp_ident = [%sedlex.regexp?
+	(
+		('a'..'z' | '_'),
+		Star ('a'..'z' | 'A'..'Z' | '0'..'9' | '_'),
+		Star (
+			'.',
+			('a'..'z' | '_'),
+			Star ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')
+		)
+	)
+]
+
 let idtype = [%sedlex.regexp? Star '_', 'A'..'Z', Star ('_' | 'a'..'z' | 'A'..'Z' | '0'..'9')]
 
 let integer = [%sedlex.regexp? ('1'..'9', Star ('0'..'9')) | '0']
@@ -592,6 +604,14 @@ and not_xml ctx depth in_open =
 	| _ ->
 		assert false
 
+let rec sharp_token lexbuf =
+	match%sedlex lexbuf with
+	| sharp_ident -> mk_ident lexbuf
+	| Plus (Chars " \t") -> sharp_token lexbuf
+	| "\r\n" -> newline lexbuf; sharp_token lexbuf
+	| '\n' | '\r' -> newline lexbuf; sharp_token lexbuf
+	| _ -> token lexbuf
+
 let lex_xml p lexbuf =
 	let name,pmin = match%sedlex lexbuf with
 	| xml_name -> lexeme lexbuf,lexeme_start lexbuf

+ 1 - 1
src/syntax/parserEntry.ml

@@ -114,7 +114,7 @@ let parse ctx code file =
 	in_macro := Define.defined ctx Define.Macro;
 	Lexer.skip_header code;
 
-	let sraw = Stream.from (fun _ -> Some (Lexer.token code)) in
+	let sraw = Stream.from (fun _ -> Some (Lexer.sharp_token code)) in
 	let rec next_token() = process_token (Lexer.token code)
 
 	and process_token tk =

+ 22 - 0
tests/unit/src/unit/issues/Issue8032.hx

@@ -0,0 +1,22 @@
+package unit.issues;
+
+import utest.Assert;
+
+class Issue8032 extends unit.Test {
+	function test() {
+		// crude but effective way to test this
+		#if sys
+			#if target.sys
+			Assert.pass();
+			#else
+			Assert.fail();
+			#end
+		#else
+			#if target.sys
+			Assert.fail();
+			#else
+			Assert.pass();
+			#end
+		#end
+	}
+}