@likec4/language-server 0.57.1 → 0.60.0

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.
Files changed (41) hide show
  1. package/dist/Rpc.js +9 -22
  2. package/dist/ast.d.ts +1 -0
  3. package/dist/ast.js +2 -2
  4. package/dist/browser/index.js +2 -2
  5. package/dist/generated/ast.d.ts +3 -3
  6. package/dist/generated/ast.js +322 -49
  7. package/dist/generated/grammar.d.ts +1 -1
  8. package/dist/generated/grammar.js +1 -1
  9. package/dist/generated/module.d.ts +4 -4
  10. package/dist/index.d.ts +2 -1
  11. package/dist/logger.js +4 -0
  12. package/dist/lsp/CodeLensProvider.d.ts +3 -2
  13. package/dist/lsp/CodeLensProvider.js +5 -1
  14. package/dist/lsp/DocumentHighlightProvider.d.ts +2 -1
  15. package/dist/lsp/DocumentHighlightProvider.js +1 -1
  16. package/dist/lsp/DocumentLinkProvider.d.ts +2 -1
  17. package/dist/lsp/DocumentLinkProvider.js +3 -3
  18. package/dist/lsp/DocumentSymbolProvider.d.ts +3 -2
  19. package/dist/lsp/DocumentSymbolProvider.js +6 -8
  20. package/dist/lsp/HoverProvider.d.ts +2 -1
  21. package/dist/lsp/HoverProvider.js +1 -1
  22. package/dist/lsp/SemanticTokenProvider.d.ts +2 -1
  23. package/dist/lsp/SemanticTokenProvider.js +1 -1
  24. package/dist/model/model-builder.d.ts +4 -4
  25. package/dist/model/model-builder.js +53 -43
  26. package/dist/model/model-locator.js +3 -1
  27. package/dist/model/model-parser.js +6 -3
  28. package/dist/module.d.ts +2 -1
  29. package/dist/module.js +3 -5
  30. package/dist/node/index.js +1 -1
  31. package/dist/references/scope-provider.js +9 -6
  32. package/dist/shared/NodeKindProvider.d.ts +3 -2
  33. package/dist/shared/WorkspaceSymbolProvider.d.ts +1 -1
  34. package/dist/shared/WorkspaceSymbolProvider.js +1 -1
  35. package/dist/test/testServices.d.ts +1 -0
  36. package/dist/test/testServices.js +39 -30
  37. package/dist/validation/element.js +14 -10
  38. package/dist/validation/index.js +16 -22
  39. package/dist/validation/specification.d.ts +1 -1
  40. package/dist/validation/specification.js +38 -9
  41. package/package.json +9 -9
package/dist/Rpc.js CHANGED
@@ -30,30 +30,17 @@ export class Rpc {
30
30
  }
31
31
  )
32
32
  );
33
- connection.onRequest(fetchModel, async (_cancelToken) => {
34
- let model;
35
- try {
36
- model = modelBuilder.buildModel() ?? null;
37
- } catch (e) {
38
- model = null;
39
- logError(e);
40
- }
41
- return Promise.resolve({ model });
33
+ connection.onRequest(fetchModel, async (cancelToken) => {
34
+ const model = await modelBuilder.buildModel(cancelToken);
35
+ return { model };
42
36
  });
43
- connection.onRequest(fetchRawModel, async (_cancelToken) => {
44
- let rawmodel;
45
- try {
46
- rawmodel = modelBuilder.buildRawModel() ?? null;
47
- } catch (e) {
48
- rawmodel = null;
49
- logError(e);
50
- }
51
- return Promise.resolve({ rawmodel });
37
+ connection.onRequest(fetchRawModel, async (cancelToken) => {
38
+ const rawmodel = await modelBuilder.buildRawModel(cancelToken);
39
+ return { rawmodel };
52
40
  });
53
- connection.onRequest(computeView, async ({ viewId }, _cancelToken) => {
54
- return Promise.resolve({
55
- view: modelBuilder.computeView(viewId)
56
- });
41
+ connection.onRequest(computeView, async ({ viewId }, cancelToken) => {
42
+ const view = await modelBuilder.computeView(viewId, cancelToken);
43
+ return { view };
57
44
  });
58
45
  connection.onRequest(buildDocuments, async ({ docs }, cancelToken) => {
59
46
  const changed = docs.map((d) => URI.parse(d));
package/dist/ast.d.ts CHANGED
@@ -53,6 +53,7 @@ export interface ParsedAstRelation {
53
53
  line?: c4.RelationshipLineType;
54
54
  head?: c4.RelationshipArrowType;
55
55
  tail?: c4.RelationshipArrowType;
56
+ links?: c4.NonEmptyArray<string>;
56
57
  }
57
58
  export interface ParsedAstElementView {
58
59
  id: c4.ViewID;
package/dist/ast.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  nonexhaustive,
8
8
  RelationRefError
9
9
  } from "@likec4/core";
10
- import { DocumentState, getContainerOfType } from "langium";
10
+ import { AstUtils, DocumentState } from "langium";
11
11
  import { isNil } from "remeda";
12
12
  import { DiagnosticSeverity } from "vscode-languageserver-protocol";
13
13
  import { elementRef } from "./elementRef.js";
@@ -77,7 +77,7 @@ export function checksFromDiagnostics(doc) {
77
77
  const invalidNodes = new WeakSet(
78
78
  doc.diagnostics?.flatMap((d) => {
79
79
  if (d.severity === DiagnosticSeverity.Error) {
80
- return getContainerOfType(d.node, isValidatableAstNode) ?? [];
80
+ return AstUtils.getContainerOfType(d.node, isValidatableAstNode) ?? [];
81
81
  }
82
82
  return [];
83
83
  }) ?? []
@@ -1,11 +1,11 @@
1
- import { EmptyFileSystem, startLanguageServer as startLanguim } from "langium";
1
+ import { startLanguageServer as startLanguim } from "langium/lsp";
2
2
  import { BrowserMessageReader, BrowserMessageWriter, createConnection } from "vscode-languageserver/browser";
3
3
  import { createLanguageServices } from "../module.js";
4
4
  export function startLanguageServer() {
5
5
  const messageReader = new BrowserMessageReader(self);
6
6
  const messageWriter = new BrowserMessageWriter(self);
7
7
  const connection = createConnection(messageReader, messageWriter);
8
- const services = createLanguageServices({ connection, ...EmptyFileSystem });
8
+ const services = createLanguageServices({ connection });
9
9
  startLanguim(services.shared);
10
10
  return {
11
11
  ...services,
@@ -1,5 +1,5 @@
1
1
  /******************************************************************************
2
- * This file was generated by langium-cli 2.1.0.
2
+ * This file was generated by langium-cli 3.0.1.
3
3
  * DO NOT EDIT MANUALLY!
4
4
  ******************************************************************************/
5
5
  import type { AstNode, Reference, ReferenceInfo, TypeMetaData } from 'langium';
@@ -38,7 +38,7 @@ export declare function isLineOptions(item: unknown): item is LineOptions;
38
38
  export type Relation = ExplicitRelation | ImplicitRelation;
39
39
  export declare const Relation = "Relation";
40
40
  export declare function isRelation(item: unknown): item is Relation;
41
- export type RelationProperty = RelationStringProperty | RelationStyleProperty;
41
+ export type RelationProperty = LinkProperty | RelationStringProperty | RelationStyleProperty;
42
42
  export declare const RelationProperty = "RelationProperty";
43
43
  export declare function isRelationProperty(item: unknown): item is RelationProperty;
44
44
  export type RelationshipStyleProperty = ArrowProperty | ColorProperty | LineProperty;
@@ -288,7 +288,7 @@ export interface LineProperty extends AstNode {
288
288
  export declare const LineProperty = "LineProperty";
289
289
  export declare function isLineProperty(item: unknown): item is LineProperty;
290
290
  export interface LinkProperty extends AstNode {
291
- readonly $container: ElementBody | ElementViewBody;
291
+ readonly $container: ElementBody | ElementViewBody | RelationBody;
292
292
  readonly $type: 'LinkProperty';
293
293
  key: 'link';
294
294
  value: Uri;
@@ -321,7 +321,7 @@ export class LikeC4AstReflection extends AbstractAstReflection {
321
321
  return this.isSubtype(StyleProperty, supertype);
322
322
  }
323
323
  case LinkProperty: {
324
- return this.isSubtype(ElementProperty, supertype) || this.isSubtype(ViewProperty, supertype);
324
+ return this.isSubtype(ElementProperty, supertype) || this.isSubtype(RelationProperty, supertype) || this.isSubtype(ViewProperty, supertype);
325
325
  }
326
326
  case RelationStringProperty:
327
327
  case RelationStyleProperty: {
@@ -369,177 +369,450 @@ export class LikeC4AstReflection extends AbstractAstReflection {
369
369
  }
370
370
  getTypeMetaData(type) {
371
371
  switch (type) {
372
+ case "ArrowProperty": {
373
+ return {
374
+ name: "ArrowProperty",
375
+ properties: [
376
+ { name: "key" },
377
+ { name: "value" }
378
+ ]
379
+ };
380
+ }
381
+ case "ColorProperty": {
382
+ return {
383
+ name: "ColorProperty",
384
+ properties: [
385
+ { name: "key" },
386
+ { name: "value" }
387
+ ]
388
+ };
389
+ }
390
+ case "CustomElementExpr": {
391
+ return {
392
+ name: "CustomElementExpr",
393
+ properties: [
394
+ { name: "body" },
395
+ { name: "target" }
396
+ ]
397
+ };
398
+ }
372
399
  case "CustomElementExprBody": {
373
400
  return {
374
401
  name: "CustomElementExprBody",
375
- mandatory: [
376
- { name: "props", type: "array" }
402
+ properties: [
403
+ { name: "props", defaultValue: [] }
404
+ ]
405
+ };
406
+ }
407
+ case "DescedantsExpr": {
408
+ return {
409
+ name: "DescedantsExpr",
410
+ properties: [
411
+ { name: "parent" }
377
412
  ]
378
413
  };
379
414
  }
380
415
  case "Element": {
381
416
  return {
382
417
  name: "Element",
383
- mandatory: [
384
- { name: "props", type: "array" }
418
+ properties: [
419
+ { name: "body" },
420
+ { name: "kind" },
421
+ { name: "name" },
422
+ { name: "props" }
385
423
  ]
386
424
  };
387
425
  }
388
426
  case "ElementBody": {
389
427
  return {
390
428
  name: "ElementBody",
391
- mandatory: [
392
- { name: "elements", type: "array" },
393
- { name: "props", type: "array" }
429
+ properties: [
430
+ { name: "elements", defaultValue: [] },
431
+ { name: "props", defaultValue: [] },
432
+ { name: "tags" }
433
+ ]
434
+ };
435
+ }
436
+ case "ElementKind": {
437
+ return {
438
+ name: "ElementKind",
439
+ properties: [
440
+ { name: "name" }
394
441
  ]
395
442
  };
396
443
  }
397
444
  case "ElementKindExpr": {
398
445
  return {
399
446
  name: "ElementKindExpr",
400
- mandatory: [
401
- { name: "isEqual", type: "boolean" }
447
+ properties: [
448
+ { name: "isEqual", defaultValue: false },
449
+ { name: "kind" }
450
+ ]
451
+ };
452
+ }
453
+ case "ElementRef": {
454
+ return {
455
+ name: "ElementRef",
456
+ properties: [
457
+ { name: "el" },
458
+ { name: "parent" }
459
+ ]
460
+ };
461
+ }
462
+ case "ElementStringProperty": {
463
+ return {
464
+ name: "ElementStringProperty",
465
+ properties: [
466
+ { name: "key" },
467
+ { name: "value" }
402
468
  ]
403
469
  };
404
470
  }
405
471
  case "ElementTagExpr": {
406
472
  return {
407
473
  name: "ElementTagExpr",
408
- mandatory: [
409
- { name: "isEqual", type: "boolean" }
474
+ properties: [
475
+ { name: "isEqual", defaultValue: false },
476
+ { name: "tag" }
477
+ ]
478
+ };
479
+ }
480
+ case "ElementView": {
481
+ return {
482
+ name: "ElementView",
483
+ properties: [
484
+ { name: "body" },
485
+ { name: "extends" },
486
+ { name: "name" },
487
+ { name: "viewOf" }
410
488
  ]
411
489
  };
412
490
  }
413
491
  case "ElementViewBody": {
414
492
  return {
415
493
  name: "ElementViewBody",
416
- mandatory: [
417
- { name: "props", type: "array" },
418
- { name: "rules", type: "array" }
494
+ properties: [
495
+ { name: "props", defaultValue: [] },
496
+ { name: "rules", defaultValue: [] },
497
+ { name: "tags" }
498
+ ]
499
+ };
500
+ }
501
+ case "ElementViewRef": {
502
+ return {
503
+ name: "ElementViewRef",
504
+ properties: [
505
+ { name: "view" }
419
506
  ]
420
507
  };
421
508
  }
422
509
  case "ExcludePredicate": {
423
510
  return {
424
511
  name: "ExcludePredicate",
425
- mandatory: [
426
- { name: "expressions", type: "array" }
512
+ properties: [
513
+ { name: "expressions", defaultValue: [] }
514
+ ]
515
+ };
516
+ }
517
+ case "ExplicitRelation": {
518
+ return {
519
+ name: "ExplicitRelation",
520
+ properties: [
521
+ { name: "body" },
522
+ { name: "kind" },
523
+ { name: "source" },
524
+ { name: "tags" },
525
+ { name: "target" },
526
+ { name: "title" }
527
+ ]
528
+ };
529
+ }
530
+ case "ExtendElement": {
531
+ return {
532
+ name: "ExtendElement",
533
+ properties: [
534
+ { name: "body" },
535
+ { name: "element" }
427
536
  ]
428
537
  };
429
538
  }
430
539
  case "ExtendElementBody": {
431
540
  return {
432
541
  name: "ExtendElementBody",
433
- mandatory: [
434
- { name: "elements", type: "array" }
542
+ properties: [
543
+ { name: "elements", defaultValue: [] }
544
+ ]
545
+ };
546
+ }
547
+ case "FqnElementRef": {
548
+ return {
549
+ name: "FqnElementRef",
550
+ properties: [
551
+ { name: "el" },
552
+ { name: "parent" }
553
+ ]
554
+ };
555
+ }
556
+ case "IconProperty": {
557
+ return {
558
+ name: "IconProperty",
559
+ properties: [
560
+ { name: "key" },
561
+ { name: "value" }
562
+ ]
563
+ };
564
+ }
565
+ case "ImplicitRelation": {
566
+ return {
567
+ name: "ImplicitRelation",
568
+ properties: [
569
+ { name: "body" },
570
+ { name: "kind" },
571
+ { name: "tags" },
572
+ { name: "target" },
573
+ { name: "title" }
435
574
  ]
436
575
  };
437
576
  }
438
577
  case "IncludePredicate": {
439
578
  return {
440
579
  name: "IncludePredicate",
441
- mandatory: [
442
- { name: "expressions", type: "array" }
580
+ properties: [
581
+ { name: "expressions", defaultValue: [] }
582
+ ]
583
+ };
584
+ }
585
+ case "IncomingExpr": {
586
+ return {
587
+ name: "IncomingExpr",
588
+ properties: [
589
+ { name: "to" }
590
+ ]
591
+ };
592
+ }
593
+ case "InOutExpr": {
594
+ return {
595
+ name: "InOutExpr",
596
+ properties: [
597
+ { name: "inout" }
443
598
  ]
444
599
  };
445
600
  }
446
601
  case "LikeC4Grammar": {
447
602
  return {
448
603
  name: "LikeC4Grammar",
449
- mandatory: [
450
- { name: "models", type: "array" },
451
- { name: "specifications", type: "array" },
452
- { name: "views", type: "array" }
604
+ properties: [
605
+ { name: "models", defaultValue: [] },
606
+ { name: "specifications", defaultValue: [] },
607
+ { name: "views", defaultValue: [] }
608
+ ]
609
+ };
610
+ }
611
+ case "LineProperty": {
612
+ return {
613
+ name: "LineProperty",
614
+ properties: [
615
+ { name: "key" },
616
+ { name: "value" }
617
+ ]
618
+ };
619
+ }
620
+ case "LinkProperty": {
621
+ return {
622
+ name: "LinkProperty",
623
+ properties: [
624
+ { name: "key" },
625
+ { name: "value" }
453
626
  ]
454
627
  };
455
628
  }
456
629
  case "Model": {
457
630
  return {
458
631
  name: "Model",
459
- mandatory: [
460
- { name: "elements", type: "array" }
632
+ properties: [
633
+ { name: "elements", defaultValue: [] },
634
+ { name: "name" }
461
635
  ]
462
636
  };
463
637
  }
464
638
  case "ModelViews": {
465
639
  return {
466
640
  name: "ModelViews",
467
- mandatory: [
468
- { name: "views", type: "array" }
641
+ properties: [
642
+ { name: "name" },
643
+ { name: "views", defaultValue: [] }
644
+ ]
645
+ };
646
+ }
647
+ case "NavigateToProperty": {
648
+ return {
649
+ name: "NavigateToProperty",
650
+ properties: [
651
+ { name: "value" }
652
+ ]
653
+ };
654
+ }
655
+ case "OutgoingExpr": {
656
+ return {
657
+ name: "OutgoingExpr",
658
+ properties: [
659
+ { name: "from" }
469
660
  ]
470
661
  };
471
662
  }
472
663
  case "RelationBody": {
473
664
  return {
474
665
  name: "RelationBody",
475
- mandatory: [
476
- { name: "props", type: "array" }
666
+ properties: [
667
+ { name: "props", defaultValue: [] },
668
+ { name: "tags" }
669
+ ]
670
+ };
671
+ }
672
+ case "RelationExpr": {
673
+ return {
674
+ name: "RelationExpr",
675
+ properties: [
676
+ { name: "source" },
677
+ { name: "target" }
678
+ ]
679
+ };
680
+ }
681
+ case "RelationshipKind": {
682
+ return {
683
+ name: "RelationshipKind",
684
+ properties: [
685
+ { name: "name" }
686
+ ]
687
+ };
688
+ }
689
+ case "RelationStringProperty": {
690
+ return {
691
+ name: "RelationStringProperty",
692
+ properties: [
693
+ { name: "key" },
694
+ { name: "value" }
477
695
  ]
478
696
  };
479
697
  }
480
698
  case "RelationStyleProperty": {
481
699
  return {
482
700
  name: "RelationStyleProperty",
483
- mandatory: [
484
- { name: "props", type: "array" }
701
+ properties: [
702
+ { name: "key" },
703
+ { name: "props", defaultValue: [] }
704
+ ]
705
+ };
706
+ }
707
+ case "ShapeProperty": {
708
+ return {
709
+ name: "ShapeProperty",
710
+ properties: [
711
+ { name: "key" },
712
+ { name: "value" }
713
+ ]
714
+ };
715
+ }
716
+ case "SpecificationElementKind": {
717
+ return {
718
+ name: "SpecificationElementKind",
719
+ properties: [
720
+ { name: "kind" },
721
+ { name: "style" }
485
722
  ]
486
723
  };
487
724
  }
488
725
  case "SpecificationRelationshipKind": {
489
726
  return {
490
727
  name: "SpecificationRelationshipKind",
491
- mandatory: [
492
- { name: "props", type: "array" }
728
+ properties: [
729
+ { name: "kind" },
730
+ { name: "props", defaultValue: [] }
493
731
  ]
494
732
  };
495
733
  }
496
734
  case "SpecificationRule": {
497
735
  return {
498
736
  name: "SpecificationRule",
499
- mandatory: [
500
- { name: "elements", type: "array" },
501
- { name: "relationships", type: "array" },
502
- { name: "tags", type: "array" }
737
+ properties: [
738
+ { name: "elements", defaultValue: [] },
739
+ { name: "name" },
740
+ { name: "relationships", defaultValue: [] },
741
+ { name: "tags", defaultValue: [] }
742
+ ]
743
+ };
744
+ }
745
+ case "SpecificationTag": {
746
+ return {
747
+ name: "SpecificationTag",
748
+ properties: [
749
+ { name: "tag" }
503
750
  ]
504
751
  };
505
752
  }
506
753
  case "StyleProperties": {
507
754
  return {
508
755
  name: "StyleProperties",
509
- mandatory: [
510
- { name: "props", type: "array" }
756
+ properties: [
757
+ { name: "key" },
758
+ { name: "props", defaultValue: [] }
759
+ ]
760
+ };
761
+ }
762
+ case "Tag": {
763
+ return {
764
+ name: "Tag",
765
+ properties: [
766
+ { name: "name" }
511
767
  ]
512
768
  };
513
769
  }
514
770
  case "Tags": {
515
771
  return {
516
772
  name: "Tags",
517
- mandatory: [
518
- { name: "value", type: "array" }
773
+ properties: [
774
+ { name: "value", defaultValue: [] }
775
+ ]
776
+ };
777
+ }
778
+ case "ViewRuleAutoLayout": {
779
+ return {
780
+ name: "ViewRuleAutoLayout",
781
+ properties: [
782
+ { name: "direction" }
519
783
  ]
520
784
  };
521
785
  }
522
786
  case "ViewRuleStyle": {
523
787
  return {
524
788
  name: "ViewRuleStyle",
525
- mandatory: [
526
- { name: "styleprops", type: "array" },
527
- { name: "targets", type: "array" }
789
+ properties: [
790
+ { name: "styleprops", defaultValue: [] },
791
+ { name: "targets", defaultValue: [] }
792
+ ]
793
+ };
794
+ }
795
+ case "ViewStringProperty": {
796
+ return {
797
+ name: "ViewStringProperty",
798
+ properties: [
799
+ { name: "key" },
800
+ { name: "value" }
528
801
  ]
529
802
  };
530
803
  }
531
804
  case "WildcardExpr": {
532
805
  return {
533
806
  name: "WildcardExpr",
534
- mandatory: [
535
- { name: "isWildcard", type: "boolean" }
807
+ properties: [
808
+ { name: "isWildcard", defaultValue: false }
536
809
  ]
537
810
  };
538
811
  }
539
812
  default: {
540
813
  return {
541
814
  name: type,
542
- mandatory: []
815
+ properties: []
543
816
  };
544
817
  }
545
818
  }
@@ -1,5 +1,5 @@
1
1
  /******************************************************************************
2
- * This file was generated by langium-cli 2.1.0.
2
+ * This file was generated by langium-cli 3.0.1.
3
3
  * DO NOT EDIT MANUALLY!
4
4
  ******************************************************************************/
5
5
  import type { Grammar } from 'langium';