@f12io/maple-language-core 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -0
- package/dist/LanguageService.d.ts +104 -0
- package/dist/LanguageService.js +16 -0
- package/dist/LanguageService.js.map +1 -0
- package/dist/extractor.helper.d.ts +66 -0
- package/dist/extractor.helper.js +319 -0
- package/dist/extractor.helper.js.map +1 -0
- package/dist/formatter.d.ts +26 -0
- package/dist/formatter.js +206 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/language-definitions.d.ts +9 -0
- package/dist/language-definitions.js +35 -0
- package/dist/language-definitions.js.map +1 -0
- package/dist/languages/AngularLanguageService.d.ts +6 -0
- package/dist/languages/AngularLanguageService.js +66 -0
- package/dist/languages/AngularLanguageService.js.map +1 -0
- package/dist/languages/BaseLanguageService.d.ts +80 -0
- package/dist/languages/BaseLanguageService.js +409 -0
- package/dist/languages/BaseLanguageService.js.map +1 -0
- package/dist/languages/HtmlLanguageService.d.ts +5 -0
- package/dist/languages/HtmlLanguageService.js +29 -0
- package/dist/languages/HtmlLanguageService.js.map +1 -0
- package/dist/languages/JavascriptLanguageService.d.ts +10 -0
- package/dist/languages/JavascriptLanguageService.js +95 -0
- package/dist/languages/JavascriptLanguageService.js.map +1 -0
- package/dist/languages/PhpLanguageService.d.ts +22 -0
- package/dist/languages/PhpLanguageService.js +242 -0
- package/dist/languages/PhpLanguageService.js.map +1 -0
- package/dist/languages/RazorLanguageService.d.ts +33 -0
- package/dist/languages/RazorLanguageService.js +338 -0
- package/dist/languages/RazorLanguageService.js.map +1 -0
- package/dist/languages/ReactLanguageService.d.ts +6 -0
- package/dist/languages/ReactLanguageService.js +31 -0
- package/dist/languages/ReactLanguageService.js.map +1 -0
- package/dist/languages/SvelteLanguageService.d.ts +9 -0
- package/dist/languages/SvelteLanguageService.js +65 -0
- package/dist/languages/SvelteLanguageService.js.map +1 -0
- package/dist/languages/TwigLanguageService.d.ts +4 -0
- package/dist/languages/TwigLanguageService.js +12 -0
- package/dist/languages/TwigLanguageService.js.map +1 -0
- package/dist/languages/VueLanguageService.d.ts +6 -0
- package/dist/languages/VueLanguageService.js +36 -0
- package/dist/languages/VueLanguageService.js.map +1 -0
- package/dist/regex.d.ts +63 -0
- package/dist/regex.js +92 -0
- package/dist/regex.js.map +1 -0
- package/dist/registry.d.ts +7 -0
- package/dist/registry.js +86 -0
- package/dist/registry.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PhpLanguageService = void 0;
|
|
4
|
+
const extractor_helper_1 = require("../extractor.helper");
|
|
5
|
+
const HtmlLanguageService_1 = require("./HtmlLanguageService");
|
|
6
|
+
class PhpLanguageService extends HtmlLanguageService_1.HtmlLanguageService {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.languageIds = ['php'];
|
|
10
|
+
}
|
|
11
|
+
getMultilineStringDelimiters(rawQuote, content) {
|
|
12
|
+
// PHP string literals may legally contain raw newlines
|
|
13
|
+
if (rawQuote === "'" || rawQuote === '"') {
|
|
14
|
+
return { open: rawQuote, close: rawQuote };
|
|
15
|
+
}
|
|
16
|
+
return super.getMultilineStringDelimiters(rawQuote, content);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Finds the `?>` that closes a PHP block, skipping string literals so a
|
|
20
|
+
* `?>` inside '...' or "..." does not terminate the block early. Returns
|
|
21
|
+
* the index of the `?` or -1.
|
|
22
|
+
*/
|
|
23
|
+
findPhpCloseTag(value, from) {
|
|
24
|
+
let i = from;
|
|
25
|
+
while (i < value.length) {
|
|
26
|
+
const stringEnd = this.skipStringAt(value, i);
|
|
27
|
+
if (stringEnd > i) {
|
|
28
|
+
i = stringEnd;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (value[i] === '?' && value[i + 1] === '>') {
|
|
32
|
+
return i;
|
|
33
|
+
}
|
|
34
|
+
i++;
|
|
35
|
+
}
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
38
|
+
formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
39
|
+
const ternaryResult = this.formatTernaryInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
40
|
+
if (ternaryResult !== undefined) {
|
|
41
|
+
return ternaryResult;
|
|
42
|
+
}
|
|
43
|
+
return super.formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
44
|
+
}
|
|
45
|
+
formatTernaryInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
46
|
+
const startIndex = cls.indexOf('<?');
|
|
47
|
+
if (startIndex === -1) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const end = this.findPhpCloseTag(cls, startIndex + 2);
|
|
51
|
+
if (end === -1) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const prefix = cls.substring(0, startIndex);
|
|
55
|
+
const suffix = cls.substring(end + 2);
|
|
56
|
+
// Strip open tag: <?= or <?php or <?
|
|
57
|
+
let openTag = '<?';
|
|
58
|
+
let innerExpr = cls.substring(startIndex + 2, end);
|
|
59
|
+
if (innerExpr.startsWith('=')) {
|
|
60
|
+
openTag = '<?=';
|
|
61
|
+
innerExpr = innerExpr.slice(1);
|
|
62
|
+
}
|
|
63
|
+
else if (innerExpr.startsWith('php')) {
|
|
64
|
+
openTag = '<?php';
|
|
65
|
+
innerExpr = innerExpr.slice(3);
|
|
66
|
+
}
|
|
67
|
+
innerExpr = innerExpr.trim();
|
|
68
|
+
const formattedExpr = this.formatExpression(innerExpr, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
69
|
+
if (formattedExpr === undefined)
|
|
70
|
+
return undefined;
|
|
71
|
+
return prefix + openTag + ' ' + formattedExpr + ' ?>' + suffix;
|
|
72
|
+
}
|
|
73
|
+
formatExpression(expr, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
74
|
+
const ternary = this.parseTernaryArms(expr);
|
|
75
|
+
if (!ternary)
|
|
76
|
+
return undefined;
|
|
77
|
+
const exprIndent = baseIndent + ' ';
|
|
78
|
+
const formattedConsequent = this.formatPhpArm(ternary.consequent.trim(), exprIndent, maxClassesPerLine, formatClassesFn);
|
|
79
|
+
const formattedAlternate = this.formatPhpArm(ternary.alternate.trim(), exprIndent, maxClassesPerLine, formatClassesFn);
|
|
80
|
+
if (formattedConsequent === undefined || formattedAlternate === undefined) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
// Always return the reconstructed ternary to enforce consistent spacing
|
|
84
|
+
return (ternary.condition +
|
|
85
|
+
' ? ' +
|
|
86
|
+
formattedConsequent +
|
|
87
|
+
' : ' +
|
|
88
|
+
formattedAlternate);
|
|
89
|
+
}
|
|
90
|
+
formatPhpArm(arm, exprIndent, maxClassesPerLine, formatClassesFn) {
|
|
91
|
+
const segments = this.parsePhpConcatenation(arm);
|
|
92
|
+
if (segments.length === 0)
|
|
93
|
+
return undefined;
|
|
94
|
+
// Build virtual template replacing expressions with placeholders
|
|
95
|
+
let virtualTemplate = '';
|
|
96
|
+
const expressions = [];
|
|
97
|
+
for (const segment of segments) {
|
|
98
|
+
if (segment.type === 'string') {
|
|
99
|
+
virtualTemplate += segment.content;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const placeholder = `__PHPEXPR${expressions.length}__`;
|
|
103
|
+
expressions.push(segment.value);
|
|
104
|
+
virtualTemplate += placeholder;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const formatted = formatClassesFn(virtualTemplate, exprIndent, maxClassesPerLine);
|
|
108
|
+
if (!formatted.includes('\n')) {
|
|
109
|
+
return arm; // No expansion needed
|
|
110
|
+
}
|
|
111
|
+
// Reconstruct PHP concatenation from formatted template
|
|
112
|
+
const quoteChar = segments.find((s) => s.type === 'string')?.quoteChar || "'";
|
|
113
|
+
if (expressions.length === 0) {
|
|
114
|
+
// Simple string, wrap in quotes
|
|
115
|
+
return quoteChar + formatted + quoteChar;
|
|
116
|
+
}
|
|
117
|
+
return this.reconstructPhpConcatenation(formatted, expressions, quoteChar);
|
|
118
|
+
}
|
|
119
|
+
reconstructPhpConcatenation(formatted, expressions, quoteChar) {
|
|
120
|
+
const parts = [];
|
|
121
|
+
let remaining = formatted;
|
|
122
|
+
for (let i = 0; i < expressions.length; i++) {
|
|
123
|
+
const placeholder = `__PHPEXPR${i}__`;
|
|
124
|
+
const idx = remaining.indexOf(placeholder);
|
|
125
|
+
if (idx === -1)
|
|
126
|
+
return ''; // error fallback
|
|
127
|
+
const before = remaining.substring(0, idx);
|
|
128
|
+
remaining = remaining.substring(idx + placeholder.length);
|
|
129
|
+
// Wrap the string part in quotes (even if empty — will be filtered)
|
|
130
|
+
parts.push(quoteChar + before + quoteChar);
|
|
131
|
+
parts.push(expressions[i]);
|
|
132
|
+
}
|
|
133
|
+
if (remaining && remaining.trim().length > 0) {
|
|
134
|
+
parts.push(quoteChar + remaining + quoteChar);
|
|
135
|
+
}
|
|
136
|
+
// Filter out completely empty strings "''" or '""'
|
|
137
|
+
const filteredParts = parts.filter((p) => p !== "''" && p !== '""' && p !== '');
|
|
138
|
+
return filteredParts.join(' . ');
|
|
139
|
+
}
|
|
140
|
+
parsePhpConcatenation(arm) {
|
|
141
|
+
const segments = [];
|
|
142
|
+
let i = 0;
|
|
143
|
+
const str = arm.trim();
|
|
144
|
+
while (i < str.length) {
|
|
145
|
+
// Skip whitespace
|
|
146
|
+
while (i < str.length && str[i].trim() === '')
|
|
147
|
+
i++;
|
|
148
|
+
if (i >= str.length)
|
|
149
|
+
break;
|
|
150
|
+
// Skip concatenation operator
|
|
151
|
+
if (str[i] === '.') {
|
|
152
|
+
i++;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const ch = str[i];
|
|
156
|
+
if (ch === "'" || ch === '"') {
|
|
157
|
+
const quoteChar = ch;
|
|
158
|
+
const start = i;
|
|
159
|
+
i = (0, extractor_helper_1.skipStringLiteral)(str, i);
|
|
160
|
+
const value = str.substring(start, i);
|
|
161
|
+
const content = str.substring(start + 1, i - 1);
|
|
162
|
+
segments.push({ type: 'string', value, content, quoteChar });
|
|
163
|
+
}
|
|
164
|
+
else if (ch === '(') {
|
|
165
|
+
// Parenthesized expression
|
|
166
|
+
const start = i;
|
|
167
|
+
let depth = 1;
|
|
168
|
+
i++;
|
|
169
|
+
while (i < str.length && depth > 0) {
|
|
170
|
+
if (str[i] === "'" || str[i] === '"') {
|
|
171
|
+
i = (0, extractor_helper_1.skipStringLiteral)(str, i);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (str[i] === '(')
|
|
175
|
+
depth++;
|
|
176
|
+
else if (str[i] === ')')
|
|
177
|
+
depth--;
|
|
178
|
+
if (depth > 0)
|
|
179
|
+
i++;
|
|
180
|
+
}
|
|
181
|
+
if (i < str.length)
|
|
182
|
+
i++; // skip closing )
|
|
183
|
+
const value = str.substring(start, i).trim();
|
|
184
|
+
if (value.length > 0) {
|
|
185
|
+
segments.push({ type: 'expression', value, content: value });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Variable or function call
|
|
190
|
+
const start = i;
|
|
191
|
+
while (i < str.length && str[i] !== '.' && str[i].trim() !== '') {
|
|
192
|
+
if (str[i] === '(') {
|
|
193
|
+
let depth = 1;
|
|
194
|
+
i++;
|
|
195
|
+
while (i < str.length && depth > 0) {
|
|
196
|
+
if (str[i] === '(')
|
|
197
|
+
depth++;
|
|
198
|
+
else if (str[i] === ')')
|
|
199
|
+
depth--;
|
|
200
|
+
i++;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
i++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const value = str.substring(start, i).trim();
|
|
208
|
+
if (value.length > 0) {
|
|
209
|
+
segments.push({ type: 'expression', value, content: value });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return segments;
|
|
214
|
+
}
|
|
215
|
+
parseInterpolation(value, index, context) {
|
|
216
|
+
// PHP interpolation: <? ... ?>
|
|
217
|
+
if (value.substring(index, index + 2) === '<?') {
|
|
218
|
+
const phpEnd = this.findPhpCloseTag(value, index + 2);
|
|
219
|
+
if (phpEnd !== -1) {
|
|
220
|
+
return {
|
|
221
|
+
innerExprStart: index + 2,
|
|
222
|
+
innerExprEnd: phpEnd,
|
|
223
|
+
endIndex: phpEnd + 2,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Internal placeholder for PHP concatenation expressions
|
|
228
|
+
if (value.substring(index, index + 9) === '__PHPEXPR') {
|
|
229
|
+
const match = /^__PHPEXPR\d+__/.exec(value.substring(index));
|
|
230
|
+
if (match) {
|
|
231
|
+
return {
|
|
232
|
+
innerExprStart: index,
|
|
233
|
+
innerExprEnd: index + match[0].length,
|
|
234
|
+
endIndex: index + match[0].length,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return super.parseInterpolation(value, index, context);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.PhpLanguageService = PhpLanguageService;
|
|
242
|
+
//# sourceMappingURL=PhpLanguageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhpLanguageService.js","sourceRoot":"","sources":["../../src/languages/PhpLanguageService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { StringLiteralMatch } from '../LanguageService';
|
|
2
|
+
import { InterpolationContext, InterpolationMatch } from './BaseLanguageService';
|
|
3
|
+
import { HtmlLanguageService } from './HtmlLanguageService';
|
|
4
|
+
export declare class RazorLanguageService extends HtmlLanguageService {
|
|
5
|
+
languageIds: string[];
|
|
6
|
+
getRenderedClassText(word: string): string;
|
|
7
|
+
getMultilineStringDelimiters(rawQuote: string, content: string): {
|
|
8
|
+
open: string;
|
|
9
|
+
close: string;
|
|
10
|
+
} | undefined;
|
|
11
|
+
matchStringLiteral(text: string, index: number): StringLiteralMatch | undefined;
|
|
12
|
+
protected skipStringAt(expr: string, index: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Scans a C# interpolated string starting just after its opening quote and
|
|
15
|
+
* returns the index after the closing quote. Handles `{expr}` holes with
|
|
16
|
+
* nested strings, `{{`/`}}` brace escapes, backslash escapes (non-verbatim)
|
|
17
|
+
* and `""` quote escapes (verbatim).
|
|
18
|
+
*/
|
|
19
|
+
private skipCSharpInterpolatedString;
|
|
20
|
+
private extractCSharpStringContent;
|
|
21
|
+
formatInterpolation(cls: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Upgrades C# interpolated strings ($"...") to verbatim interpolated
|
|
24
|
+
* strings ($@"...") only when formatting actually injected newlines into
|
|
25
|
+
* them, because standard interpolated strings cannot contain unescaped
|
|
26
|
+
* newlines. Strings the formatter left single-line keep their original
|
|
27
|
+
* form (and their escape semantics).
|
|
28
|
+
*/
|
|
29
|
+
private upgradeMultilineInterpolatedStrings;
|
|
30
|
+
private formatTernaryInterpolation;
|
|
31
|
+
formatExpression(expr: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string | undefined;
|
|
32
|
+
protected parseInterpolation(value: string, index: number, context?: InterpolationContext): InterpolationMatch | undefined;
|
|
33
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RazorLanguageService = void 0;
|
|
4
|
+
const extractor_helper_1 = require("../extractor.helper");
|
|
5
|
+
const HtmlLanguageService_1 = require("./HtmlLanguageService");
|
|
6
|
+
const IMPLICIT_EXPR_START_REGEX = /^@[a-zA-Z_]\w*/;
|
|
7
|
+
const MEMBER_ACCESS_REGEX = /^\.\w+/;
|
|
8
|
+
class RazorLanguageService extends HtmlLanguageService_1.HtmlLanguageService {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.languageIds = ['razor', 'aspnetcorerazor'];
|
|
12
|
+
}
|
|
13
|
+
getRenderedClassText(word) {
|
|
14
|
+
// Razor renders the @@ escape as a single literal @
|
|
15
|
+
return word.replace(/@@/g, '@');
|
|
16
|
+
}
|
|
17
|
+
getMultilineStringDelimiters(rawQuote, content) {
|
|
18
|
+
// Only verbatim C# strings can hold newlines. Upgrading is unsafe when
|
|
19
|
+
// the content has backslash escapes (verbatim strings don't process them).
|
|
20
|
+
if (content.includes('\\'))
|
|
21
|
+
return undefined;
|
|
22
|
+
if (rawQuote === '$"' || rawQuote === '$@"') {
|
|
23
|
+
return { open: '$@"', close: '"' };
|
|
24
|
+
}
|
|
25
|
+
if (rawQuote === '"') {
|
|
26
|
+
return { open: '@"', close: '"' };
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
matchStringLiteral(text, index) {
|
|
31
|
+
if (text[index] === '$') {
|
|
32
|
+
if (text[index + 1] === '"') {
|
|
33
|
+
const end = this.skipCSharpInterpolatedString(text, index + 2, false);
|
|
34
|
+
if (end < index + 3 || text[end - 1] !== '"')
|
|
35
|
+
return undefined;
|
|
36
|
+
return {
|
|
37
|
+
start: index,
|
|
38
|
+
contentStart: index + 2,
|
|
39
|
+
contentEnd: end - 1,
|
|
40
|
+
endIndex: end,
|
|
41
|
+
rawDelimiter: '$"',
|
|
42
|
+
isInterpolated: true,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (text[index + 1] === '@' && text[index + 2] === '"') {
|
|
46
|
+
const end = this.skipCSharpInterpolatedString(text, index + 3, true);
|
|
47
|
+
if (end < index + 4 || text[end - 1] !== '"')
|
|
48
|
+
return undefined;
|
|
49
|
+
return {
|
|
50
|
+
start: index,
|
|
51
|
+
contentStart: index + 3,
|
|
52
|
+
contentEnd: end - 1,
|
|
53
|
+
endIndex: end,
|
|
54
|
+
rawDelimiter: '$@"',
|
|
55
|
+
isInterpolated: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return super.matchStringLiteral(text, index);
|
|
60
|
+
}
|
|
61
|
+
skipStringAt(expr, index) {
|
|
62
|
+
const ch = expr[index];
|
|
63
|
+
// C# interpolated string: $"..." or $@"..."
|
|
64
|
+
if (ch === '$') {
|
|
65
|
+
if (expr[index + 1] === '"') {
|
|
66
|
+
return this.skipCSharpInterpolatedString(expr, index + 2, false);
|
|
67
|
+
}
|
|
68
|
+
if (expr[index + 1] === '@' && expr[index + 2] === '"') {
|
|
69
|
+
return this.skipCSharpInterpolatedString(expr, index + 3, true);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return super.skipStringAt(expr, index);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Scans a C# interpolated string starting just after its opening quote and
|
|
76
|
+
* returns the index after the closing quote. Handles `{expr}` holes with
|
|
77
|
+
* nested strings, `{{`/`}}` brace escapes, backslash escapes (non-verbatim)
|
|
78
|
+
* and `""` quote escapes (verbatim).
|
|
79
|
+
*/
|
|
80
|
+
skipCSharpInterpolatedString(expr, contentStart, isVerbatim) {
|
|
81
|
+
let j = contentStart;
|
|
82
|
+
let braceDepth = 0;
|
|
83
|
+
while (j < expr.length) {
|
|
84
|
+
const c = expr[j];
|
|
85
|
+
if (braceDepth === 0) {
|
|
86
|
+
if (c === '{' && expr[j + 1] === '{') {
|
|
87
|
+
j += 2; // escaped literal brace
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (c === '}' && expr[j + 1] === '}') {
|
|
91
|
+
j += 2; // escaped literal brace
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (c === '{') {
|
|
95
|
+
braceDepth++;
|
|
96
|
+
j++;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!isVerbatim && c === '\\') {
|
|
100
|
+
j += 2; // backslash escape (\", \\, \n, ...)
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (isVerbatim && c === '"' && expr[j + 1] === '"') {
|
|
104
|
+
j += 2; // verbatim quote escape
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (c === '"') {
|
|
108
|
+
return j + 1; // closing quote
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
if (c === '{') {
|
|
113
|
+
braceDepth++;
|
|
114
|
+
}
|
|
115
|
+
else if (c === '}') {
|
|
116
|
+
braceDepth--;
|
|
117
|
+
}
|
|
118
|
+
else if (c === '"' || c === "'") {
|
|
119
|
+
// Nested string inside an interpolation hole
|
|
120
|
+
j = (0, extractor_helper_1.skipStringLiteral)(expr, j);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
j++;
|
|
125
|
+
}
|
|
126
|
+
return expr.length;
|
|
127
|
+
}
|
|
128
|
+
extractCSharpStringContent(str) {
|
|
129
|
+
if (str.startsWith('$@"') && str.endsWith('"')) {
|
|
130
|
+
return str.slice(3, -1);
|
|
131
|
+
}
|
|
132
|
+
if (str.startsWith('$"') && str.endsWith('"')) {
|
|
133
|
+
return str.slice(2, -1);
|
|
134
|
+
}
|
|
135
|
+
if (str.startsWith('"') && str.endsWith('"') && str.length >= 2) {
|
|
136
|
+
return str.slice(1, -1);
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
141
|
+
// Try ternary expansion for @(...) expressions
|
|
142
|
+
const ternaryResult = this.formatTernaryInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
143
|
+
if (ternaryResult !== undefined) {
|
|
144
|
+
return ternaryResult;
|
|
145
|
+
}
|
|
146
|
+
const formatted = super.formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
147
|
+
if (formatted === cls)
|
|
148
|
+
return formatted;
|
|
149
|
+
return this.upgradeMultilineInterpolatedStrings(formatted);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Upgrades C# interpolated strings ($"...") to verbatim interpolated
|
|
153
|
+
* strings ($@"...") only when formatting actually injected newlines into
|
|
154
|
+
* them, because standard interpolated strings cannot contain unescaped
|
|
155
|
+
* newlines. Strings the formatter left single-line keep their original
|
|
156
|
+
* form (and their escape semantics).
|
|
157
|
+
*/
|
|
158
|
+
upgradeMultilineInterpolatedStrings(formatted) {
|
|
159
|
+
let result = '';
|
|
160
|
+
let i = 0;
|
|
161
|
+
while (i < formatted.length) {
|
|
162
|
+
if (formatted[i] === '$' && formatted[i + 1] === '"') {
|
|
163
|
+
const end = this.skipCSharpInterpolatedString(formatted, i + 2, false);
|
|
164
|
+
const segment = formatted.substring(i, end);
|
|
165
|
+
result += segment.includes('\n') ? '$@' + segment.substring(1) : segment;
|
|
166
|
+
i = end;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
result += formatted[i];
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
formatTernaryInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
175
|
+
const startIndex = cls.indexOf('@(');
|
|
176
|
+
if (startIndex === -1)
|
|
177
|
+
return undefined;
|
|
178
|
+
const end = this.parseBalanced(cls, startIndex + 1);
|
|
179
|
+
if (end === -1)
|
|
180
|
+
return undefined;
|
|
181
|
+
const prefix = cls.substring(0, startIndex);
|
|
182
|
+
const suffix = cls.substring(end);
|
|
183
|
+
const innerExpr = cls.substring(startIndex + 2, end - 1);
|
|
184
|
+
const formattedExpr = this.formatExpression(innerExpr, baseIndent, maxClassesPerLine, formatClassesFn);
|
|
185
|
+
if (formattedExpr === undefined)
|
|
186
|
+
return undefined;
|
|
187
|
+
return prefix + '@(' + formattedExpr + ')' + suffix;
|
|
188
|
+
}
|
|
189
|
+
formatExpression(expr, baseIndent, maxClassesPerLine, formatClassesFn) {
|
|
190
|
+
const ternary = this.parseTernaryArms(expr);
|
|
191
|
+
if (!ternary)
|
|
192
|
+
return undefined;
|
|
193
|
+
const consequentStr = ternary.consequent.trim();
|
|
194
|
+
const alternateStr = ternary.alternate.trim();
|
|
195
|
+
// Reconstructing the ternary rewrites both arms as verbatim strings
|
|
196
|
+
// ($@"..."), which changes what backslash escapes mean. Bail out when a
|
|
197
|
+
// non-verbatim arm contains escapes so we never alter runtime values.
|
|
198
|
+
if ((consequentStr.startsWith('$"') && consequentStr.includes('\\')) ||
|
|
199
|
+
(alternateStr.startsWith('$"') && alternateStr.includes('\\'))) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
const consequentContent = this.extractCSharpStringContent(consequentStr);
|
|
203
|
+
const alternateContent = this.extractCSharpStringContent(alternateStr);
|
|
204
|
+
if (consequentContent === undefined || alternateContent === undefined) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
const exprIndent = baseIndent + ' ';
|
|
208
|
+
const formattedConsequent = formatClassesFn(consequentContent, exprIndent, maxClassesPerLine);
|
|
209
|
+
const formattedAlternate = formatClassesFn(alternateContent, exprIndent, maxClassesPerLine);
|
|
210
|
+
// Always return the reconstructed ternary to enforce consistent spacing (e.g., spaces around `?` and `:`)
|
|
211
|
+
// Determine string prefix: use $@" for interpolated strings
|
|
212
|
+
const consequentIsInterpolated = consequentStr.startsWith('$"') || consequentStr.startsWith('$@"');
|
|
213
|
+
const alternateIsInterpolated = alternateStr.startsWith('$"') || alternateStr.startsWith('$@"');
|
|
214
|
+
const consequentPrefix = consequentIsInterpolated ? '$@' : '';
|
|
215
|
+
const alternatePrefix = alternateIsInterpolated ? '$@' : '';
|
|
216
|
+
return (ternary.condition +
|
|
217
|
+
' ? ' +
|
|
218
|
+
consequentPrefix +
|
|
219
|
+
'"' +
|
|
220
|
+
formattedConsequent +
|
|
221
|
+
'" : ' +
|
|
222
|
+
alternatePrefix +
|
|
223
|
+
'"' +
|
|
224
|
+
formattedAlternate +
|
|
225
|
+
'"');
|
|
226
|
+
}
|
|
227
|
+
parseInterpolation(value, index, context) {
|
|
228
|
+
// Escaped transition: @@ renders a single literal '@' — never the start
|
|
229
|
+
// of an expression.
|
|
230
|
+
if (value[index] === '@' && value[index + 1] === '@') {
|
|
231
|
+
return {
|
|
232
|
+
innerExprStart: index,
|
|
233
|
+
innerExprEnd: index + 2,
|
|
234
|
+
endIndex: index + 2,
|
|
235
|
+
isLiteral: true,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
// Razor interpolation: @(...)
|
|
239
|
+
if (value.substring(index, index + 2) === '@(') {
|
|
240
|
+
const end = this.parseBalanced(value, index + 1);
|
|
241
|
+
if (end !== -1) {
|
|
242
|
+
return {
|
|
243
|
+
innerExprStart: index + 2,
|
|
244
|
+
innerExprEnd: end - 1,
|
|
245
|
+
endIndex: end,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Razor implicit expression: @identifier followed by any chain of
|
|
250
|
+
// member accesses, method calls, or indexers (@Model.Css, @Get(x)[0])
|
|
251
|
+
if (value[index] === '@' &&
|
|
252
|
+
value[index + 1] !== '@' &&
|
|
253
|
+
value[index + 1] !== '(') {
|
|
254
|
+
const match = IMPLICIT_EXPR_START_REGEX.exec(value.substring(index));
|
|
255
|
+
if (match) {
|
|
256
|
+
let end = index + match[0].length;
|
|
257
|
+
for (;;) {
|
|
258
|
+
if (value[end] === '.' && MEMBER_ACCESS_REGEX.test(value.substring(end))) {
|
|
259
|
+
const memberMatch = MEMBER_ACCESS_REGEX.exec(value.substring(end));
|
|
260
|
+
end += memberMatch[0].length;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (value[end] === '(' || value[end] === '[') {
|
|
264
|
+
const balancedEnd = this.parseBalanced(value, end);
|
|
265
|
+
if (balancedEnd === -1)
|
|
266
|
+
break;
|
|
267
|
+
end = balancedEnd;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
innerExprStart: index + 1,
|
|
274
|
+
innerExprEnd: end,
|
|
275
|
+
endIndex: end,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Inside a non-verbatim C# interpolated string, backslash escapes are
|
|
280
|
+
// processed at runtime: \t, \n etc. render as whitespace (separating
|
|
281
|
+
// classes), while \\ and \" render as literal characters. Verbatim
|
|
282
|
+
// strings ($@") treat backslashes literally, so only $" applies.
|
|
283
|
+
if (context?.stringDelimiter === '$"' && value[index] === '\\') {
|
|
284
|
+
const next = value[index + 1] ?? '';
|
|
285
|
+
if (/[tnrfv0]/.test(next)) {
|
|
286
|
+
// Whitespace escape — acts as a class separator, contains no expression
|
|
287
|
+
return {
|
|
288
|
+
innerExprStart: index,
|
|
289
|
+
innerExprEnd: index,
|
|
290
|
+
endIndex: index + 2,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// Any other escape stays attached to the surrounding token verbatim
|
|
294
|
+
return {
|
|
295
|
+
innerExprStart: index,
|
|
296
|
+
innerExprEnd: index + 2,
|
|
297
|
+
endIndex: index + 2,
|
|
298
|
+
isLiteral: true,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Braces are expression holes inside C# interpolated strings
|
|
302
|
+
// ($"w-{width}"); in plain Razor markup they are literal text. When no
|
|
303
|
+
// context is available (tokenization of already-extracted values) treat
|
|
304
|
+
// them as holes so brace expressions stay grouped in one token.
|
|
305
|
+
const inInterpolatedString = context?.stringDelimiter === '$"' || context?.stringDelimiter === '$@"';
|
|
306
|
+
if (!context || inInterpolatedString) {
|
|
307
|
+
if (value[index] === '{' && value[index + 1] === '{') {
|
|
308
|
+
return {
|
|
309
|
+
innerExprStart: index,
|
|
310
|
+
innerExprEnd: index + 2,
|
|
311
|
+
endIndex: index + 2,
|
|
312
|
+
isLiteral: true,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
if (value[index] === '}' && value[index + 1] === '}') {
|
|
316
|
+
return {
|
|
317
|
+
innerExprStart: index,
|
|
318
|
+
innerExprEnd: index + 2,
|
|
319
|
+
endIndex: index + 2,
|
|
320
|
+
isLiteral: true,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (value[index] === '{') {
|
|
324
|
+
const end = this.parseBalanced(value, index);
|
|
325
|
+
if (end !== -1) {
|
|
326
|
+
return {
|
|
327
|
+
innerExprStart: index + 1,
|
|
328
|
+
innerExprEnd: end - 1,
|
|
329
|
+
endIndex: end,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return super.parseInterpolation(value, index, context);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
exports.RazorLanguageService = RazorLanguageService;
|
|
338
|
+
//# sourceMappingURL=RazorLanguageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RazorLanguageService.js","sourceRoot":"","sources":["../../src/languages/RazorLanguageService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { MapleRegion } from '../LanguageService';
|
|
2
|
+
import { JavascriptLanguageService } from './JavascriptLanguageService';
|
|
3
|
+
export declare class ReactLanguageService extends JavascriptLanguageService {
|
|
4
|
+
languageIds: string[];
|
|
5
|
+
collectRegions(text: string): Array<MapleRegion>;
|
|
6
|
+
}
|