Bläddra i källkod

Support literal interpolated strings ($@"")

Joey Marianer 8 år sedan
förälder
incheckning
c71ca222d3
2 ändrade filer med 36 tillägg och 7 borttagningar
  1. 14 6
      src/csharp.ts
  2. 22 1
      test/csharp.test.ts

+ 14 - 6
src/csharp.ts

@@ -90,16 +90,12 @@ export var language = <ILanguage> {
 			// delimiters and operators
 			[/}/, { cases: {
 					'$S2==interpolatedstring' : { token: 'string.quote', next: '@pop' }
+					'$S2==litinterpstring' : { token: 'string.quote', next: '@pop' }
 				,	'@default'   : '@brackets' } }],
 			[/[{}()\[\]]/, '@brackets'],
 			[/[<>](?!@symbols)/, '@brackets'],
 			[/@symbols/, { cases: { '@operators': 'delimiter', '@default'  : '' } } ],
 
-			// literal string
-			[/\@"/, { token: 'string.quote', next: '@litstring' } ],
-
-			// interpolated string
-			[/\$"/, { token: 'string.quote', next: '@interpolatedstring' } ],
 
 			// numbers
 			[/\d*\.\d+([eE][\-+]?\d+)?[fFdD]?/, 'number.float'],
@@ -112,6 +108,9 @@ export var language = <ILanguage> {
 			// strings
 			[/"([^"\\]|\\.)*$/, 'string.invalid' ],  // non-teminated string
 			[/"/,  { token: 'string.quote', next: '@string' } ],
+			[/\$\@"/, { token: 'string.quote', next: '@litinterpstring' } ],
+			[/\@"/, { token: 'string.quote', next: '@litstring' } ],
+			[/\$"/, { token: 'string.quote', next: '@interpolatedstring' } ],
 
 			// characters
 			[/'[^\\']'/, 'string'],
@@ -155,6 +154,15 @@ export var language = <ILanguage> {
 			[/"/,        { token: 'string.quote', next: '@pop' } ]
 		],
 
+    litinterpstring: [
+      [/[^"{]+/,    'string'],
+			[/""/,       'string.escape'],
+			[/{{/,       'string.escape'],
+			[/}}/,       'string.escape'],
+			[/{/,        { token: 'string.quote', next: 'root.litinterpstring' } ],
+			[/"/,        { token: 'string.quote', next: '@pop' } ]
+    ],
+
 		interpolatedstring: [
 			[/[^\\"{]+/, 'string'],
 			[/@escapes/, 'string.escape'],
@@ -173,4 +181,4 @@ export var language = <ILanguage> {
 			[/\/\/.*$/,    'comment'],
 		],
 	},
-};
+};

+ 22 - 1
test/csharp.test.ts

@@ -740,5 +740,26 @@ testTokenization('csharp', [
 		{ startIndex: 0, type: 'string.cs' },
 		{ startIndex: 6, type: 'string.quote.cs' },
 		{ startIndex: 7, type: 'delimiter.cs' }
-	]}]
+	]}],
+
+  [{
+  line: 'x = $@"verbatim {interpolated} string{{}}"" ";',
+  tokens: [
+    { startIndex: 0, type: "identifier.cs" }
+    { startIndex: 1, type: "" }
+    { startIndex: 2, type: "delimiter.cs" }
+    { startIndex: 3, type: "" }
+    { startIndex: 4, type: "string.quote.cs" }
+    { startIndex: 7, type: "string.cs" }
+    { startIndex: 16, type: "string.quote.cs" }
+    { startIndex: 17, type: "identifier.cs" }
+    { startIndex: 29, type: "string.quote.cs" }
+    { startIndex: 30, type: "string.cs" }
+    { startIndex: 37, type: "string.escape.cs" }
+    { startIndex: 39, type: "string.cs" }
+    { startIndex: 41, type: "string.escape.cs" }
+    { startIndex: 43, type: "string.cs" }
+    { startIndex: 44, type: "string.quote.cs" }
+    { startIndex: 45, type: "delimiter.cs" }
+  ]}],
 ]);