// Different definitions of strings and character literals,
// some with prefixes and suffixes (not all are currently highlighted)

""
"fo\"o"
"foo\
bar"
"foo"B

@""
@"foo"
@"fo""o"
@"foo"B

""""""
"""fo""o"
bar"""
"""foo"""B

'a'
'a'B
'\''
'\\'
'\231'
'\x41'
'\u0041'
'\U0001F47D'

$"{1+1}"

"" // end
"fo\"o" // end
"foo\ // part of the string
bar" // end
"foo"B // end

@"" // end
@"foo" // end
@"fo""o" // end
@"foo"B // end

"""""" // end
"""fo""o" // part of the string
bar""" // end
"""foo"""B // end

'a' // end
'a'B // end
'\'' // end
'\\' // end
'\231' // end
'\x41' // end
'\u0041' // end
'\U0001F47D' // end

$"{1+1}" // end

0
"string \'" // end
1
"this string contains a
new line"  // end
2
"this string jumps a line\
but the result has no new line" // end
3
@"verbatim "" \' {
string" // end
4
"""triple quoted " \' {
string""" // end
5
$"interpola\ {{
ted \' {1 + 1 // can contain comments and " in placeholders
}string"  // end
6
$@"interpolated "" \' {{
verbatim{1 + 1 // can contain comments and " in placeholders
}string"  // end
7
@$"interpolated "" \' {{
verbatim{1 + 1 // can contain comments and " in placeholders
}string"  // end
8
$"""interpolated triple quoted " \' {{ { (sprintf "%d%s" 42)
// and " and comments...
}string"""  // end
9
$"""test { @"{it's not a placeholder!}" } asdf""" // end
10
$"""test { $"but this is:{1+1}" } asdf""" // end
11
$"interpola\ {{
ted \' {1 + 1 // can contain comments in placeholders
// placeholders cannot contain "
}string"  // end
12
$@"interpolated "" \' {{
verbatim{1 + 1 // can contain comments in placeholders
// placeholders cannot contain "
}string"  // end
13
$"""interpolated triple quoted " \' {{ { (sprintf "%d%s" 42) // can contain "
// and comments...
}string"""  // end
14
let list = [1]
$"""test{ list |> List.map (fun x -> x + 1) }test"""  // end
15
$"test{1 (* " Does it break the string? " *) }test"  // end
16
$"test\
{
    let x = 42  // valid comment contains " quote " ...
    x (* " Does it break the string? " *) 
}test"  // end
17
$"""test
{
    #if DEBUG
    #endif
    let asdf = "}" // """ does it break?
    let x = $@"test{2+2 (* " what about double nesting? " *) }test"
    let lit = 0
    let x = unitTask { return () }
    asdf
}test"""
18
let list = [1]
$"""test
{
    let asdf = "}"
    list |> List.map (fun x -> x + 1)

}test"""  // end
19