@marko/language-server 0.12.12 → 0.12.13

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/dist/index.js CHANGED
@@ -575,7 +575,7 @@ function loadCompilerInfo(dir) {
575
575
  const rootDir = import_lasso_package_root.default.getRootDir(dir);
576
576
  const pkgPath = rootDir && import_resolve_from.default.silent(rootDir, "@marko/compiler/package.json");
577
577
  const pkg = pkgPath && require(pkgPath);
578
- const cache3 = /* @__PURE__ */ new Map();
578
+ const cache4 = /* @__PURE__ */ new Map();
579
579
  let translator = builtinTranslator;
580
580
  let compiler = builtinCompiler;
581
581
  if (pkg && /^5\./.test(pkg.version)) {
@@ -592,16 +592,16 @@ function loadCompilerInfo(dir) {
592
592
  }
593
593
  }
594
594
  return {
595
- cache: cache3,
595
+ cache: cache4,
596
596
  get lookup() {
597
- let lookup = cache3.get(lookupKey);
597
+ let lookup = cache4.get(lookupKey);
598
598
  if (lookup === void 0) {
599
599
  try {
600
600
  lookup = compiler.taglib.buildLookup(dir, translator);
601
601
  } catch {
602
602
  lookup = builtinInfo.lookup;
603
603
  }
604
- cache3.set(lookupKey, lookup);
604
+ cache4.set(lookupKey, lookup);
605
605
  }
606
606
  return lookup;
607
607
  },
@@ -625,7 +625,7 @@ function display(type, data) {
625
625
  }
626
626
 
627
627
  // src/service/index.ts
628
- var import_vscode_languageserver14 = require("vscode-languageserver");
628
+ var import_vscode_languageserver15 = require("vscode-languageserver");
629
629
 
630
630
  // src/service/marko/complete/index.ts
631
631
  var import_vscode_languageserver6 = require("vscode-languageserver");
@@ -687,10 +687,10 @@ function getTagNameCompletion({
687
687
  const fileURIForTag = import_vscode_uri2.URI.file(fileForTag).toString();
688
688
  const nodeModuleMatch = /\/node_modules\/((?:@[^/]+\/)?[^/]+)/.exec(fileForTag);
689
689
  const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];
690
- const isCoreTag = nodeModuleName === "marko";
690
+ const isCoreTag = /^@?marko[/-]/.test(tag.taglibId) || nodeModuleName === "marko";
691
691
  const documentation = {
692
692
  kind: import_vscode_languageserver2.MarkupKind.Markdown,
693
- value: tag.html ? `Built in [<${tag.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.` : nodeModuleName ? isCoreTag ? `Core Marko [<${tag.name}>](${fileURIForTag}) tag.` : `Custom Marko tag discovered from the ["${nodeModuleName}"](${fileURIForTag}) npm package.` : `Custom Marko tag discovered from:
693
+ value: tag.html ? `Built in [&lt;${tag.name}&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.` : isCoreTag ? `Core Marko &lt;${tag.name}&gt; tag.` : nodeModuleName ? `Custom Marko tag discovered from the ["${nodeModuleName}"](${fileURIForTag}) npm package.` : `Custom Marko tag discovered from:
694
694
 
695
695
  [${importer ? import_path2.default.relative(importer, fileForTag) : fileForTag}](${fileURIForTag})`
696
696
  };
@@ -1078,10 +1078,10 @@ var markoErrorRegExp = /^(.+?)(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
1078
1078
  var doValidate = (doc) => {
1079
1079
  const fsPath = getDocFile(doc);
1080
1080
  const diagnostics = [];
1081
- const { compiler, translator, cache: cache3 } = getCompilerInfo(doc);
1081
+ const { compiler, translator, cache: cache4 } = getCompilerInfo(doc);
1082
1082
  try {
1083
1083
  compiler.compileSync(doc.getText(), fsPath || "untitled.marko", {
1084
- cache: cache3,
1084
+ cache: cache4,
1085
1085
  translator,
1086
1086
  code: false,
1087
1087
  output: "source",
@@ -1099,6 +1099,62 @@ var doValidate = (doc) => {
1099
1099
  return diagnostics;
1100
1100
  };
1101
1101
 
1102
+ // src/utils/utils.ts
1103
+ var import_fs = __toESM(require("fs"));
1104
+ var import_vscode_uri3 = require("vscode-uri");
1105
+ var import_vscode_languageserver8 = require("vscode-languageserver");
1106
+ var import_vscode_languageserver_textdocument = require("vscode-languageserver-textdocument");
1107
+ var START_OF_FILE = import_vscode_languageserver8.Range.create(import_vscode_languageserver8.Position.create(0, 0), import_vscode_languageserver8.Position.create(0, 0));
1108
+ function createTextDocument(filename) {
1109
+ const uri = import_vscode_uri3.URI.file(filename).toString();
1110
+ const content = import_fs.default.readFileSync(filename, "utf-8");
1111
+ return import_vscode_languageserver_textdocument.TextDocument.create(uri, "plaintext", 0, content);
1112
+ }
1113
+
1114
+ // src/service/marko/hover/OpenTagName.ts
1115
+ function OpenTagName2({
1116
+ document,
1117
+ lookup,
1118
+ parsed,
1119
+ node
1120
+ }) {
1121
+ const importer = getDocFile(document);
1122
+ const tag = node.parent;
1123
+ const range = parsed.locationAt(node);
1124
+ const tagDef = tag.nameText && lookup.getTag(tag.nameText);
1125
+ if (tagDef) {
1126
+ const completion = getTagNameCompletion({
1127
+ tag: tagDef,
1128
+ range: START_OF_FILE,
1129
+ importer
1130
+ });
1131
+ return {
1132
+ range,
1133
+ contents: completion.documentation
1134
+ };
1135
+ }
1136
+ }
1137
+
1138
+ // src/service/marko/hover/index.ts
1139
+ var handlers2 = {
1140
+ OpenTagName: OpenTagName2
1141
+ };
1142
+ var doHover = async (doc, params) => {
1143
+ var _a;
1144
+ const parsed = parse2(doc);
1145
+ const offset = doc.offsetAt(params.position);
1146
+ const node = parsed.nodeAt(offset);
1147
+ return await ((_a = handlers2[NodeType[node.type]]) == null ? void 0 : _a.call(handlers2, {
1148
+ document: doc,
1149
+ params,
1150
+ parsed,
1151
+ offset,
1152
+ node,
1153
+ code: doc.getText(),
1154
+ ...getCompilerInfo(doc)
1155
+ }));
1156
+ };
1157
+
1102
1158
  // src/service/marko/definition/OpenTagName.ts
1103
1159
  var import_path4 = __toESM(require("path"));
1104
1160
  var import_vscode_uri4 = require("vscode-uri");
@@ -1128,20 +1184,8 @@ function escape(val) {
1128
1184
  return String(val).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
1129
1185
  }
1130
1186
 
1131
- // src/utils/utils.ts
1132
- var import_fs = __toESM(require("fs"));
1133
- var import_vscode_uri3 = require("vscode-uri");
1134
- var import_vscode_languageserver8 = require("vscode-languageserver");
1135
- var import_vscode_languageserver_textdocument = require("vscode-languageserver-textdocument");
1136
- var START_OF_FILE = import_vscode_languageserver8.Range.create(import_vscode_languageserver8.Position.create(0, 0), import_vscode_languageserver8.Position.create(0, 0));
1137
- function createTextDocument(filename) {
1138
- const uri = import_vscode_uri3.URI.file(filename).toString();
1139
- const content = import_fs.default.readFileSync(filename, "utf-8");
1140
- return import_vscode_languageserver_textdocument.TextDocument.create(uri, "plaintext", 0, content);
1141
- }
1142
-
1143
1187
  // src/service/marko/definition/OpenTagName.ts
1144
- function OpenTagName2({
1188
+ function OpenTagName3({
1145
1189
  lookup,
1146
1190
  parsed,
1147
1191
  node
@@ -1211,8 +1255,8 @@ function AttrName2({
1211
1255
  }
1212
1256
 
1213
1257
  // src/service/marko/definition/index.ts
1214
- var handlers2 = {
1215
- OpenTagName: OpenTagName2,
1258
+ var handlers3 = {
1259
+ OpenTagName: OpenTagName3,
1216
1260
  AttrName: AttrName2
1217
1261
  };
1218
1262
  var findDefinition = async (doc, params) => {
@@ -1220,7 +1264,7 @@ var findDefinition = async (doc, params) => {
1220
1264
  const parsed = parse2(doc);
1221
1265
  const offset = doc.offsetAt(params.position);
1222
1266
  const node = parsed.nodeAt(offset);
1223
- return await ((_a = handlers2[NodeType[node.type]]) == null ? void 0 : _a.call(handlers2, {
1267
+ return await ((_a = handlers3[NodeType[node.type]]) == null ? void 0 : _a.call(handlers3, {
1224
1268
  document: doc,
1225
1269
  params,
1226
1270
  parsed,
@@ -1245,14 +1289,18 @@ function extractDocumentLinks(doc, parsed, lookup) {
1245
1289
  const read = (range) => code.slice(range.start, range.end);
1246
1290
  const visit = (node) => {
1247
1291
  switch (node.type) {
1292
+ case 14 /* AttrTag */:
1293
+ if (node.body) {
1294
+ for (const child of node.body) {
1295
+ visit(child);
1296
+ }
1297
+ }
1298
+ break;
1248
1299
  case 1 /* Tag */:
1249
1300
  if (node.attrs && node.nameText) {
1250
1301
  for (const attr of node.attrs) {
1251
1302
  if (isDocumentLinkAttr(doc, node, attr)) {
1252
- links.push(import_vscode_languageserver11.DocumentLink.create({
1253
- start: parsed.positionAt(attr.value.value.start),
1254
- end: parsed.positionAt(attr.value.value.end)
1255
- }, resolveUrl(read(attr.value.value).slice(1, -1), doc.uri)));
1303
+ links.push(import_vscode_languageserver11.DocumentLink.create(parsed.locationAt(attr.value.value), resolveUrl(read(attr.value.value).slice(1, -1), doc.uri)));
1256
1304
  }
1257
1305
  }
1258
1306
  }
@@ -1274,10 +1322,10 @@ function extractDocumentLinks(doc, parsed, lookup) {
1274
1322
  const tagDef = lookup.getTag(tagName);
1275
1323
  const fileForTag = tagDef && (tagDef.template || tagDef.renderer);
1276
1324
  if (fileForTag) {
1277
- links.push(import_vscode_languageserver11.DocumentLink.create({
1278
- start: parsed.positionAt(item.start + match.index),
1279
- end: parsed.positionAt(item.start + match.index + length)
1280
- }, fileForTag));
1325
+ links.push(import_vscode_languageserver11.DocumentLink.create(parsed.locationAt({
1326
+ start: item.start + match.index,
1327
+ end: item.start + match.index + length
1328
+ }), fileForTag));
1281
1329
  }
1282
1330
  }
1283
1331
  }
@@ -1300,14 +1348,55 @@ var findDocumentLinks = async (doc) => {
1300
1348
  return result;
1301
1349
  };
1302
1350
 
1303
- // src/service/marko/format.ts
1304
- var import_vscode_languageserver12 = require("vscode-languageserver");
1351
+ // src/service/marko/document-symbols/extract.ts
1305
1352
  var import_vscode_uri7 = require("vscode-uri");
1353
+ var import_vscode_languageserver12 = require("vscode-languageserver");
1354
+ function extractDocumentSymbols(doc, parsed, lookup) {
1355
+ if (import_vscode_uri7.URI.parse(doc.uri).scheme === "untitled") {
1356
+ return [];
1357
+ }
1358
+ const symbols = [];
1359
+ const { program } = parsed;
1360
+ const visit = (node) => {
1361
+ var _a, _b;
1362
+ switch (node.type) {
1363
+ case 1 /* Tag */:
1364
+ case 14 /* AttrTag */:
1365
+ symbols.push(import_vscode_languageserver12.SymbolInformation.create((node.type === 14 /* AttrTag */ ? (_a = node.nameText) == null ? void 0 : _a.slice(node.nameText.indexOf("@")) : node.nameText) || "<${...}>", node.nameText && ((_b = lookup.getTag(node.nameText)) == null ? void 0 : _b.html) && import_vscode_languageserver12.SymbolKind.Property || import_vscode_languageserver12.SymbolKind.Class, parsed.locationAt(node), doc.uri));
1366
+ if (node.body) {
1367
+ for (const child of node.body) {
1368
+ visit(child);
1369
+ }
1370
+ }
1371
+ break;
1372
+ }
1373
+ };
1374
+ for (const item of program.body) {
1375
+ visit(item);
1376
+ }
1377
+ return symbols;
1378
+ }
1379
+
1380
+ // src/service/marko/document-symbols/index.ts
1381
+ var cache2 = /* @__PURE__ */ new WeakMap();
1382
+ var findDocumentSymbols = async (doc) => {
1383
+ const parsed = parse2(doc);
1384
+ let result = cache2.get(parsed);
1385
+ if (!result) {
1386
+ result = extractDocumentSymbols(doc, parsed, getCompilerInfo(doc).lookup);
1387
+ cache2.set(parsed, result);
1388
+ }
1389
+ return result;
1390
+ };
1391
+
1392
+ // src/service/marko/format.ts
1393
+ var import_vscode_languageserver13 = require("vscode-languageserver");
1394
+ var import_vscode_uri8 = require("vscode-uri");
1306
1395
  var prettier = __toESM(require("prettier"));
1307
1396
  var markoPrettier = __toESM(require("prettier-plugin-marko"));
1308
1397
  var format2 = async (doc, params, cancel) => {
1309
1398
  try {
1310
- const { fsPath, scheme } = import_vscode_uri7.URI.parse(doc.uri);
1399
+ const { fsPath, scheme } = import_vscode_uri8.URI.parse(doc.uri);
1311
1400
  const text = doc.getText();
1312
1401
  const options = {
1313
1402
  parser: "marko",
@@ -1322,7 +1411,7 @@ var format2 = async (doc, params, cancel) => {
1322
1411
  if (cancel.isCancellationRequested)
1323
1412
  return;
1324
1413
  return [
1325
- import_vscode_languageserver12.TextEdit.replace(import_vscode_languageserver12.Range.create(doc.positionAt(0), doc.positionAt(text.length)), prettier.format(text, options))
1414
+ import_vscode_languageserver13.TextEdit.replace(import_vscode_languageserver13.Range.create(doc.positionAt(0), doc.positionAt(text.length)), prettier.format(text, options))
1326
1415
  ];
1327
1416
  } catch (e) {
1328
1417
  displayError(e);
@@ -1333,13 +1422,15 @@ var format2 = async (doc, params, cancel) => {
1333
1422
  var marko_default = {
1334
1423
  doComplete,
1335
1424
  doValidate,
1425
+ doHover,
1336
1426
  findDefinition,
1337
1427
  findDocumentLinks,
1428
+ findDocumentSymbols,
1338
1429
  format: format2
1339
1430
  };
1340
1431
 
1341
1432
  // src/service/stylesheet/index.ts
1342
- var import_vscode_languageserver13 = require("vscode-languageserver");
1433
+ var import_vscode_languageserver14 = require("vscode-languageserver");
1343
1434
  var import_vscode_css_languageservice2 = require("vscode-css-languageservice");
1344
1435
  var import_vscode_languageserver_textdocument2 = require("vscode-languageserver-textdocument");
1345
1436
 
@@ -1445,6 +1536,13 @@ function extractStyleSheets(code, program, lookup) {
1445
1536
  const visit = (node) => {
1446
1537
  var _a, _b;
1447
1538
  switch (node.type) {
1539
+ case 14 /* AttrTag */:
1540
+ if (node.body) {
1541
+ for (const child of node.body) {
1542
+ visit(child);
1543
+ }
1544
+ }
1545
+ break;
1448
1546
  case 1 /* Tag */:
1449
1547
  if (node.nameText === "style" && node.concise && node.attrs) {
1450
1548
  const block = node.attrs.at(-1);
@@ -1501,7 +1599,7 @@ function extractStyleSheets(code, program, lookup) {
1501
1599
  }
1502
1600
 
1503
1601
  // src/service/stylesheet/index.ts
1504
- var cache2 = /* @__PURE__ */ new WeakMap();
1602
+ var cache3 = /* @__PURE__ */ new WeakMap();
1505
1603
  var services = {
1506
1604
  css: import_vscode_css_languageservice2.getCSSLanguageService,
1507
1605
  less: import_vscode_css_languageservice2.getLESSLanguageService,
@@ -1543,7 +1641,7 @@ var StyleSheetService = {
1543
1641
  }
1544
1642
  return result;
1545
1643
  }
1546
- return import_vscode_languageserver13.CompletionList.create([], true);
1644
+ return import_vscode_languageserver14.CompletionList.create([], true);
1547
1645
  },
1548
1646
  findDefinition(doc, params) {
1549
1647
  const infoByExt = getStyleSheetInfo(doc);
@@ -1589,6 +1687,32 @@ var StyleSheetService = {
1589
1687
  return result.length ? result : void 0;
1590
1688
  }
1591
1689
  },
1690
+ findDocumentSymbols(doc) {
1691
+ const infoByExt = getStyleSheetInfo(doc);
1692
+ const result = [];
1693
+ for (const ext in infoByExt) {
1694
+ const info = infoByExt[ext];
1695
+ const { service: service2, virtualDoc } = info;
1696
+ for (const symbol of service2.findDocumentSymbols(virtualDoc, info.parsed)) {
1697
+ if (symbol.location.uri === doc.uri) {
1698
+ const range = getSourceRange(doc, info, symbol.location.range);
1699
+ if (range) {
1700
+ result.push({
1701
+ kind: symbol.kind,
1702
+ name: symbol.name,
1703
+ tags: symbol.tags,
1704
+ deprecated: symbol.deprecated,
1705
+ containerName: symbol.containerName,
1706
+ location: { uri: doc.uri, range }
1707
+ });
1708
+ }
1709
+ } else {
1710
+ result.push(symbol);
1711
+ }
1712
+ }
1713
+ }
1714
+ return result.length ? result : void 0;
1715
+ },
1592
1716
  async findDocumentLinks(doc) {
1593
1717
  const infoByExt = getStyleSheetInfo(doc);
1594
1718
  const result = [];
@@ -1662,7 +1786,7 @@ var StyleSheetService = {
1662
1786
  continue;
1663
1787
  const { service: service2, virtualDoc } = info;
1664
1788
  const result = [];
1665
- for (const colorPresentation of service2.getColorPresentations(virtualDoc, info.parsed, params.color, import_vscode_languageserver13.Range.create(virtualDoc.positionAt(generatedOffsetStart), virtualDoc.positionAt(generatedOffsetEnd)))) {
1789
+ for (const colorPresentation of service2.getColorPresentations(virtualDoc, info.parsed, params.color, import_vscode_languageserver14.Range.create(virtualDoc.positionAt(generatedOffsetStart), virtualDoc.positionAt(generatedOffsetEnd)))) {
1666
1790
  const textEdit = colorPresentation.textEdit && getSourceEdit(doc, info, colorPresentation.textEdit);
1667
1791
  const additionalTextEdits = colorPresentation.additionalTextEdits && getSourceEdits(doc, info, colorPresentation.additionalTextEdits);
1668
1792
  if (textEdit || additionalTextEdits) {
@@ -1720,7 +1844,7 @@ var StyleSheetService = {
1720
1844
  }
1721
1845
  if (result.documentChanges) {
1722
1846
  for (const change of result.documentChanges) {
1723
- if (import_vscode_languageserver13.TextDocumentEdit.is(change)) {
1847
+ if (import_vscode_languageserver14.TextDocumentEdit.is(change)) {
1724
1848
  if (change.textDocument.uri === doc.uri) {
1725
1849
  change.edits = getSourceEdits(doc, info, change.edits) || [];
1726
1850
  }
@@ -1743,7 +1867,7 @@ var StyleSheetService = {
1743
1867
  if (generatedOffsetEnd === void 0)
1744
1868
  continue;
1745
1869
  const { service: service2, virtualDoc } = info;
1746
- const result = service2.doCodeActions(virtualDoc, import_vscode_languageserver13.Range.create(virtualDoc.positionAt(generatedOffsetStart), virtualDoc.positionAt(generatedOffsetEnd)), params.context, info.parsed);
1870
+ const result = service2.doCodeActions(virtualDoc, import_vscode_languageserver14.Range.create(virtualDoc.positionAt(generatedOffsetStart), virtualDoc.positionAt(generatedOffsetEnd)), params.context, info.parsed);
1747
1871
  for (const command of result) {
1748
1872
  const edits = (_a = command.arguments) == null ? void 0 : _a[2];
1749
1873
  if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {
@@ -1828,7 +1952,7 @@ function getSourceRange(doc, info, range) {
1828
1952
  function getStyleSheetInfo(doc) {
1829
1953
  var _a;
1830
1954
  const parsed = parse2(doc);
1831
- let cached = cache2.get(parsed);
1955
+ let cached = cache3.get(parsed);
1832
1956
  if (!cached) {
1833
1957
  const results = extractStyleSheets(doc.getText(), parsed.program, getCompilerInfo(doc).lookup);
1834
1958
  cached = {};
@@ -1849,7 +1973,7 @@ function getStyleSheetInfo(doc) {
1849
1973
  parsed: service2.parseStylesheet(virtualDoc)
1850
1974
  };
1851
1975
  }
1852
- cache2.set(parsed, cached);
1976
+ cache3.set(parsed, cached);
1853
1977
  }
1854
1978
  return cached;
1855
1979
  }
@@ -1893,7 +2017,7 @@ var service = {
1893
2017
  displayError(err);
1894
2018
  }
1895
2019
  if (items) {
1896
- return import_vscode_languageserver14.CompletionList.create(items, isIncomplete);
2020
+ return import_vscode_languageserver15.CompletionList.create(items, isIncomplete);
1897
2021
  }
1898
2022
  },
1899
2023
  async findDefinition(doc, params, cancel) {
@@ -1932,6 +2056,24 @@ var service = {
1932
2056
  }
1933
2057
  return result;
1934
2058
  },
2059
+ async findDocumentSymbols(doc, params, cancel) {
2060
+ let result;
2061
+ try {
2062
+ for (const pending of plugins.map((plugin) => {
2063
+ var _a;
2064
+ return (_a = plugin.findDocumentSymbols) == null ? void 0 : _a.call(plugin, doc, params, cancel);
2065
+ })) {
2066
+ const cur = await pending;
2067
+ if (cancel.isCancellationRequested)
2068
+ return;
2069
+ if (cur)
2070
+ result = result ? result.concat(cur) : cur;
2071
+ }
2072
+ } catch (err) {
2073
+ displayError(err);
2074
+ }
2075
+ return result;
2076
+ },
1935
2077
  async findDocumentLinks(doc, params, cancel) {
1936
2078
  let result;
1937
2079
  try {
@@ -2132,6 +2274,7 @@ connection2.onInitialize(async (params) => {
2132
2274
  documentLinkProvider: { resolveProvider: false },
2133
2275
  colorProvider: true,
2134
2276
  documentHighlightProvider: true,
2277
+ documentSymbolProvider: true,
2135
2278
  completionProvider: {
2136
2279
  triggerCharacters: [
2137
2280
  ".",
@@ -2177,6 +2320,9 @@ connection2.onReferences(async (params, cancel) => {
2177
2320
  connection2.onDocumentLinks(async (params, cancel) => {
2178
2321
  return await service.findDocumentLinks(documents.get(params.textDocument.uri), params, cancel) || null;
2179
2322
  });
2323
+ connection2.onDocumentSymbol(async (params, cancel) => {
2324
+ return await service.findDocumentSymbols(documents.get(params.textDocument.uri), params, cancel) || null;
2325
+ });
2180
2326
  connection2.onDocumentHighlight(async (params, cancel) => {
2181
2327
  return await service.findDocumentHighlights(documents.get(params.textDocument.uri), params, cancel) || null;
2182
2328
  });