summaryrefslogtreecommitdiffstats
path: root/modules/plugins/languages/dart.nix
blob: ddc8a2a3a1906c23ed7eec4336fc8adb3ac89608 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
{
  config,
  pkgs,
  lib,
  ...
}: let
  inherit (lib.modules) mkIf mkMerge;
  inherit (lib) genAttrs;
  inherit (lib.trivial) boolToString;
  inherit (lib.options) mkEnableOption mkOption literalExpression;
  inherit (lib.types) enum package nullOr str bool listOf;
  inherit (lib.strings) optionalString;
  inherit (lib.nvim.types) mkGrammarOption;
  inherit (lib.nvim.dag) entryAfter;

  cfg = config.vim.languages.dart;
  ftcfg = cfg.flutter-tools;

  defaultServers = ["dart"];
  servers = ["dart"];
in {
  options.vim.languages.dart = {
    enable = mkEnableOption "Dart language support";

    treesitter = {
      enable =
        mkEnableOption "Dart treesitter"
        // {
          default = config.vim.languages.enableTreesitter;
          defaultText = literalExpression "config.vim.languages.enableTreesitter";
        };
      package = mkGrammarOption pkgs "dart";
    };

    lsp = {
      enable =
        mkEnableOption "Dart LSP support"
        // {
          default = config.vim.lsp.enable;
          defaultText = literalExpression "config.vim.lsp.enable";
        };
      servers = mkOption {
        type = listOf (enum servers);
        default = defaultServers;
        description = "Dart LSP server to use";
      };
    };

    dap = {
      enable =
        mkEnableOption "Dart DAP support via flutter-tools"
        // {
          default = config.vim.languages.enableDAP;
          defaultText = literalExpression "config.vim.languages.enableDAP";
        };
    };

    flutter-tools = {
      enable =
        mkEnableOption "flutter-tools for flutter support"
        // {
          default = config.vim.lsp.enable;
          defaultText = literalExpression "config.vim.lsp.enable";
        };

      flutterPackage = mkOption {
        type = nullOr package;
        default = pkgs.flutter;
        description = "Flutter package, or null to detect the flutter path at runtime instead.";
      };

      enableNoResolvePatch = mkOption {
        type = bool;
        default = false;
        description = ''
          Whether to patch flutter-tools so that it doesn't resolve
          symlinks when detecting flutter path.

          ::: {.note}
          This is required if `flutterPackage` is set to null and the flutter
          package in your `PATH` was built with Nix. If you are using a flutter
          SDK installed from a different source and encounter the error "`dart`
          missing from `PATH`", leave this option disabled.
          :::
        '';
      };

      color = {
        enable = mkEnableOption "highlighting color variables";

        highlightBackground = mkOption {
          type = bool;
          default = false;
          description = "Highlight the background";
        };

        highlightForeground = mkOption {
          type = bool;
          default = false;
          description = "Highlight the foreground";
        };

        virtualText = {
          enable = mkEnableOption "Show the highlight using virtual text";

          character = mkOption {
            type = str;
            default = "■";
            description = "Virtual text character to highlight";
          };
        };
      };
    };
  };

  config = mkIf cfg.enable (mkMerge [
    (mkIf cfg.treesitter.enable {
      vim.treesitter.enable = true;
      vim.treesitter.grammars = [cfg.treesitter.package];
    })

    (mkIf cfg.lsp.enable {
      vim.lsp = {
        presets = genAttrs cfg.lsp.servers (_: {enable = true;});
        servers = genAttrs cfg.lsp.servers (_: {
          filetypes = ["dart"];
        });
      };
    })

    (mkIf ftcfg.enable {
      vim.startPlugins = [
        (
          if ftcfg.enableNoResolvePatch
          then "flutter-tools-patched"
          else "flutter-tools-nvim"
        )
        "plenary-nvim"
      ];

      vim.pluginRC.flutter-tools = entryAfter ["lsp-servers"] ''
        require('flutter-tools').setup {
          ${optionalString (ftcfg.flutterPackage != null) "flutter_path = \"${ftcfg.flutterPackage}/bin/flutter\","}
          lsp = {
            color = { -- show the derived colours for dart variables
              enabled = ${boolToString ftcfg.color.enable}, -- whether or not to highlight color variables at all, only supported on flutter >= 2.10
              background = ${boolToString ftcfg.color.highlightBackground}, -- highlight the background
              foreground = ${boolToString ftcfg.color.highlightForeground}, -- highlight the foreground
              virtual_text = ${boolToString ftcfg.color.virtualText.enable}, -- show the highlight using virtual text
              virtual_text_str = ${ftcfg.color.virtualText.character} -- the virtual text character to highlight
            },

            capabilities = capabilities,
          },
          ${optionalString cfg.dap.enable ''
          debugger = {
            enabled = true,
          },
        ''}
        }
      '';
    })
  ]);
}