[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/csharp-mode 5730c99 401/459: Split functionality to two
From: |
ELPA Syncer |
Subject: |
[elpa] externals/csharp-mode 5730c99 401/459: Split functionality to two files |
Date: |
Sun, 22 Aug 2021 14:00:10 -0400 (EDT) |
branch: externals/csharp-mode
commit 5730c9946b74b37cfbd4fff68f48fdf1b3e0fa03
Author: Theodor Thornhill <theo@thornhill.no>
Commit: Theodor Thornhill <theo@thornhill.no>
Split functionality to two files
---
README.org | 3 +
csharp-mode.el | 620 +----------------------------
csharp-mode.el => csharp-tree-sitter.el | 678 +-------------------------------
3 files changed, 14 insertions(+), 1287 deletions(-)
diff --git a/README.org b/README.org
index 1ce9c40..1c673ff 100644
--- a/README.org
+++ b/README.org
@@ -22,6 +22,9 @@ This is a mode for editing C# in emacs. It's using
[[https://github.com/ubolonto
** tree-sitter support
You can enable experimental tree sitter support for indentation and
highlighting using
#+begin_src elisp
+ (use-package tree-sitter)
+ (use-package tree-sitter-langs)
+
(use-package csharp-mode
:init
(setq csharp-mode-enable-tree-sitter t))
diff --git a/csharp-mode.el b/csharp-mode.el
index c6485dd..026a491 100644
--- a/csharp-mode.el
+++ b/csharp-mode.el
@@ -8,7 +8,6 @@
;; Version : 0.10.0
;; Keywords : c# languages oop mode
;; X-URL : https://github.com/josteink/csharp-mode
-;; Package-Requires: ((emacs "26.1") (tree-sitter "0.12.1") (seq "2.21"))
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -25,11 +24,6 @@
;;; Code:
-(require 'cl-lib)
-(require 'seq)
-(require 'tree-sitter)
-(require 'tree-sitter-hl)
-
(when (version< emacs-version "25.1")
(require 'cl))
(require 'cc-mode)
@@ -45,6 +39,13 @@
:group 'prog-mode)
+(defcustom csharp-mode-enable-tree-sitter nil
+ "Use tree sitter for font locking and indentation."
+ :type 'boolean)
+
+(defvar csharp-mode-tree-sitter-patterns)
+(defun csharp-mode-indent-line ())
+
(eval-and-compile
(defconst csharp--regex-identifier
"[A-Za-z][A-Za-z0-9_]*"
@@ -657,612 +658,6 @@ compilation and evaluation time conflicts."
(add-to-list 'compilation-error-regexp-alist-alist regexp)
(add-to-list 'compilation-error-regexp-alist (car regexp)))))
-;;; Tree-sitter
-
-(defcustom csharp-mode-enable-tree-sitter nil
- "Use tree sitter for font locking and indentation."
- :type 'boolean)
-
-(defvar-local csharp-mode-tree-sitter-patterns
- [ ;; Various constructs
- (comment) @comment
- (modifier) @keyword
- (this_expression) @keyword
-
- ;; Literals
- [(real_literal) (integer_literal)] @number
- (null_literal) @constant
- (boolean_literal) @constant
- (character_literal) @string
-
- ;; Keywords
- ["using" "namespace" "class" "if" "else" "throw" "new" "for"
- "return" "await" "struct" "enum" "switch" "case"
- "default" "typeof" "try" "catch" "finally" "break"
- "foreach" "in" "yield" "get" "set" "when" "as" "out"
- "is" "while" "continue" "this" "ref" "goto" "interface"
- "from" "where" "select"
- ] @keyword
-
- ;; Linq
- (from_clause (identifier) @variable)
- (group_clause)
- (order_by_clause)
- (select_clause (identifier) @variable)
- (query_continuation (identifier) @variable) @keyword
-
- ;; String
- (interpolation (identifier) (interpolation_format_clause) @variable)
- (interpolation (identifier)* @variable)
- [(string_literal) (verbatim_string_literal)
(interpolated_string_expression)] @string
-
- ;; Enum
- (enum_member_declaration (identifier) @variable)
- (enum_declaration (identifier) @type)
-
- ;; Interface
- (interface_declaration
- name: (identifier) @type)
-
- ;; Struct
- (struct_declaration (identifier) @type)
-
- ;; Namespace
- (namespace_declaration
- name: (identifier) @type)
-
- ;; Class
- (base_list (identifier) @type)
- (property_declaration
- type: (nullable_type) @type
- name: (identifier) @variable)
- (property_declaration
- type: (predefined_type) @type
- name: (identifier) @variable)
- (property_declaration
- type: (identifier) @type
- name: (identifier) @variable)
- (class_declaration
- name: (identifier) @type)
- (constructor_declaration (identifier) @type)
-
- ;; Method
- (method_declaration (identifier) @type (identifier) @function)
- (method_declaration (predefined_type) @type (identifier) @function)
- (method_declaration (nullable_type) @type (identifier) @function)
- (method_declaration (void_keyword) @type (identifier) @function)
- (method_declaration (generic_name) (identifier) @function)
-
- ;; Function
- (local_function_statement (identifier) @type (identifier) @function)
- (local_function_statement (predefined_type) @type (identifier) @function)
- (local_function_statement (nullable_type) @type (identifier) @function)
- (local_function_statement (void_keyword) @type (identifier) @function)
- (local_function_statement (generic_name) (identifier) @function)
-
- ;; Parameter
- (parameter
- type: (identifier) @type
- name: (identifier) @variable)
- (parameter (identifier) @variable)
-
- ;; Array
- (array_rank_specifier (identifier) @variable)
- (array_type (identifier) @type)
- (array_creation_expression)
-
- ;; Attribute
- (attribute (identifier) @variable (attribute_argument_list))
- (attribute (identifier) @variable)
-
- ;; Object init
- (anonymous_object_creation_expression)
- (object_creation_expression (identifier) @type)
- (initializer_expression (identifier) @variable)
-
- ;; Variable
- (variable_declaration (identifier) @type)
- (variable_declarator (identifier) @variable)
-
- ;; Equals value
- (equals_value_clause (identifier) @variable)
-
- ;; Return
- (return_statement (identifier) @variable)
- (yield_statement (identifier) @variable)
-
- ;; Type
- (type_parameter
- (identifier) @type)
- (type_argument_list
- (identifier) @type)
- (generic_name
- (identifier) @type)
- (implicit_type) @type
- (predefined_type) @type
- (nullable_type) @type
- ["operator"] @type
-
- ;; Exprs
- (binary_expression (identifier) @variable (identifier) @variable)
- (binary_expression (identifier)* @variable)
- (conditional_expression (identifier) @variable)
- (prefix_unary_expression (identifier)* @variable)
- (postfix_unary_expression (identifier)* @variable)
- (type_of_expression (identifier) @variable)
- (assignment_expression (identifier) @variable)
- (cast_expression (identifier) @type)
-
- ;; Preprocessor
- (preprocessor_directive) @constant
- (preprocessor_call (identifier) @string)
-
- ;; Loop
- (for_each_statement (identifier) @type (identifier) @variable)
- (for_each_statement (implicit_type) @type (identifier) @variable)
- (for_each_statement (predefined_type) @type (identifier) @variable)
-
- ;; Exception
- (catch_declaration (identifier) @type (identifier) @variable)
- (catch_declaration (identifier) @type)
-
- ;; Switch
- (switch_statement (identifier) @variable)
- (switch_expression (identifier) @variable)
-
- ;; If
- (if_statement (identifier) @variable)
-
- ;; Declaration expression
- (declaration_expression (implicit_type) (identifier) @variable)
-
- ;; Arrow expression
- (arrow_expression_clause (identifier) @variable)
-
- ;; Other
- (label_name) @variable
- (qualified_name (identifier) @type)
- (using_directive (identifier)* @type)
- (await_expression (identifier)* @function)
- (invocation_expression (identifier) @function)
- (element_access_expression (identifier) @variable)
- (conditional_access_expression (identifier) @variable)
- (member_binding_expression (identifier) @variable)
- (member_access_expression (identifier) @function)
- (name_colon (identifier)* @variable)
- (name_equals (identifier) @type)
- (field_declaration)
- (argument (identifier) @variable)
- ]
- "Default patterns for tree-sitter support.")
-
-;;; Tree-sitter indentation
-
-(defgroup csharp-mode-indent nil "Indent lines using Tree-sitter as backend"
- :group 'tree-sitter)
-
-(defcustom csharp-mode-indent-offset 4
- "Indent offset for csharp-mode"
- :type 'integer
- :group 'csharp)
-
-(defcustom csharp-mode-indent-scopes
- '((indent-all . ;; these nodes are always indented
- (accessor_declaration
- break_statement
- arrow_expression_clause
- parameter_list
- conditional_expression
- "."))
- (indent-rest . ;; if parent node is one of these and node is not first →
indent
- (
- binary_expression
- switch_section
- ))
- (indent-body . ;; if parent node is one of these and current node is in
middle → indent
- (block
- anonymous_object_creation_expression
- enum_member_declaration_list
- initializer_expression
- expression_statement
- declaration_list
- attribute_argument_list
- switch_body))
-
- (paren-indent . ;; if parent node is one of these → indent to paren opener
- (parenthesized_expression))
- (align-char-to . ;; chaining char → node types we move parentwise to find
the first chaining char
- ())
- (aligned-siblings . ;; siblings (nodes with same parent) should be aligned
to the first child
- (parameter))
-
- (multi-line-text . ;; if node is one of these, then don't modify the indent
- ;; this is basically a peaceful way out by saying "this
looks like something
- ;; that cannot be indented using AST, so best I leave it
as-is"
- (comment
- preprocessor_call
- labeled_statement))
- (outdent . ;; these nodes always outdent (1 shift in opposite direction)
- (;; "}"
- case_switch_label
- ))
- )
- "Scopes for indenting in C#."
- :type 'sexp)
-
-;;;; Private functions
-(defun csharp-mode-indent--node-is-indent-all (node)
- "Non-nil if NODE type is in indent-all group.
-
-Nodes in this group will be always +1 indentend."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .indent-all)))
-
-(defun csharp-mode-indent--node-is-indent-rest (node)
- "Non-nil if NODE type is in indent-rest group.
-
-Nodes in this group will +1 indentend if they are a non-first
-child of parent node."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .indent-rest)))
-
-(defun csharp-mode-indent--node-is-indent-body (node)
- "Non-nil if NODE type is in indent-body group.
-
-Nodes in this group will +1 indentend if they are both a
-non-first child of and non-last child of parent node."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .indent-body)))
-
-(defun csharp-mode-indent--node-is-multi-line-text (node)
- "Non-nil if NODE type is in indent-rest group.
-
-Nodes in this group will keep their current indentation"
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .multi-line-text)))
-
-(defun csharp-mode-indent--node-is-aligned-sibling (node)
- "Non-nil if NODE type is in aligned-siblings group.
-
-Nodes in this group will be aligned to the column of the first sibling."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .aligned-siblings)))
-
-(defun csharp-mode-indent--highest-node-at-position (position)
- "Get the node at buffer POSITION that's at the highest level.
-
-POSITION is a byte position in buffer like \\(point-min\\)."
- (save-excursion
- (goto-char position)
- ;; maybe implement this as a cl-loop
- (let* ((current-node (tree-sitter-node-at-point)))
- ;; move upwards until we either don't have aparent node
- ;; or we moved out of line
- (while (and
- current-node
- (when-let* ((parent-node (tsc-get-parent current-node)))
- (when (and ;; parent and current share same position
- (eq (tsc-node-start-byte parent-node)
- (tsc-node-start-byte current-node)))
- ;; move upwards to the parent node
- (setq current-node parent-node)))))
- current-node)))
-
-(defun csharp-mode-indent--parentwise-path (node)
- "Get list of nodes by moving parent-wise starting at NODE.
-
-The last element in returned path is NODE."
- (let ((next-parent-node (tsc-get-parent node))
- (path
- (list node)))
- (while next-parent-node
- ;; collect
- (push next-parent-node path)
- ;; move to next iteration
- (setq next-parent-node (tsc-get-parent next-parent-node)))
- path))
-
-(defun csharp-mode-indent--node-is-paren-indent (node)
- "Non-nil if NODE type is in paren-indent group.
-
-Child nodes in this group will be indentend to the paren opener
-column."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .paren-indent)))
-
-(defun csharp-mode-indent--chain-column (current-node align-char-to-alist
parentwise-path)
- "When node is in a chain call, return column to align each call.
-
-CURRENT-NODE current node being indented
-ALIGN-CHAR-TO-ALIST char → group of node types we can move within when
searching
-for the first chain char.
-This group is supposed to contain all node types conformed by a chain.
-PARENTWISE-PATH nodes from CURRENT-NODE to tree root (\"document\")
-
-Returns a column to indent to or nil if no such column can / should be applied.
-
-Reads text from current buffer."
- (let ((first-character-for-current-node
- (string-to-char
- (tsc-node-text current-node))))
- (when-let* ((last-parent-belongs-to
- (alist-get first-character-for-current-node
- align-char-to-alist))
- (last-parent-belonging-to
- (thread-last parentwise-path
- (reverse) ;; path starts at (ts-parent current-node)
- (cdr) ;; skip current-node
- ;; walk within allowed boundaries
- (seq-take-while
- (lambda (node)
- (member (tsc-node-type node)
- last-parent-belongs-to)))
- (seq-first)))
- (first-char-position-within-last-parent-node
- ;; naive search, could be updated later
- ;; this may detect wrong column-char with something like
⎡a(should().ignore().this)\n.b()\n.c()⎦
- (save-excursion
- (goto-char
- (tsc-node-start-byte last-parent-belonging-to))
- (search-forward-regexp
- (regexp-quote
- (char-to-string
- first-character-for-current-node))
- (tsc-node-end-byte current-node)
- t)
- (- (point) 1)))
- (end-of-parent-line-pos
- (save-excursion
- (goto-char
- (tsc-node-start-byte last-parent-belonging-to))
- (line-end-position))))
- (when (and (numberp first-char-position-within-last-parent-node)
- ;; char is within parent line
- (or (< first-char-position-within-last-parent-node
- end-of-parent-line-pos)
- ;; char is the first in its line
- (eq first-char-position-within-last-parent-node
- (save-excursion
- (goto-char
- first-char-position-within-last-parent-node)
- (back-to-indentation)
- (point)))))
- ;; indent to column, which is (char-pos - line-begin-pos)
- (save-excursion
- (goto-char first-char-position-within-last-parent-node)
- (- first-char-position-within-last-parent-node
- (line-beginning-position)))))))
-
-(defun csharp-mode-indent--first-sibling-column (current-node parent-node)
- "Column position for CURRENT-NODE's first sibling.
-
-If CURRENT-NODE belongs to the aligned-siblings group, will look up the first
-sibling in same group \\(running through PARENT-NODE's children) and return
-its column.
-
-CSHARP-MODE-INDENT-SCOPES is used to test whether
-CURRENT-NODE belongs to the aligned-siblings group."
- (when (and parent-node
- (csharp-mode-indent--node-is-aligned-sibling current-node))
- (when-let* ((current-node-type
- (tsc-node-type current-node))
- (first-sibling
- (cl-loop for ith-sibling = (tsc-get-nth-child parent-node 0)
- then (tsc-get-next-sibling ith-sibling)
- while (not (null ith-sibling))
- if (equal current-node-type
- (tsc-node-type ith-sibling))
- return ith-sibling
- end))
- (first-sibling-position
- (tsc-node-start-byte first-sibling)))
- (when (not (tsc-node-eq current-node first-sibling))
- (save-excursion
- (goto-char first-sibling-position)
- (- first-sibling-position
- (line-beginning-position)))))))
-
-(cl-defun csharp-mode-indent--indents-in-path (parentwise-path original-column)
- "Map PARENTWISE-PATH into indent instructions.
-
-Each element of the returned list is one of the following
-
-no-indent nothing to add to current column
-indent add one indent to current column
-outdent subtract one indent to current column
-\(column-indent . COLUMN) match parent's parent opener column
-\(preserve . ORIGINAL-COLUMN) preserve the column that was before
-
-What is checked to add an indent:
-- A node bolongs into the \"indent\" group in CSHARP-MODE-INDENT-SCOPES
-- Deterimen what group the node's parent belongs to, and whether the node
-is in a middle position.
-- A node belongs to the \"outdent\" group in CSHARP-MODE-INDENT-SCOPES
-- A node belongs to the \"column-indent\" group in CSHARP-MODE-INDENT-SCOPES"
- (let ((last-node
- (seq-elt
- parentwise-path
- (-
- (length parentwise-path)
- 1))))
- (thread-last parentwise-path
- (seq-map
- (lambda (current-node)
- (let* ((previous-node
- (tsc-get-prev-sibling current-node))
- (next-node
- (tsc-get-next-sibling current-node))
- (parent-node
- (tsc-get-parent current-node))
- (current-node-is-rest
- previous-node)
- (current-node-is-middle-node
- (and current-node-is-rest next-node))
- (current-node-must-indent
- (csharp-mode-indent--node-is-indent-all current-node))
- (current-node-must-outdent
- (and
- (eq last-node current-node)
- (csharp-mode-indent--node-is-outdent current-node)))
- (chain-column
- (csharp-mode-indent--chain-column
- current-node
- (let-alist csharp-mode-indent-scopes
- .align-char-to)
- parentwise-path))
- (sibling-column
- (csharp-mode-indent--first-sibling-column
- current-node
- parent-node)))
- (cond
- ((numberp chain-column)
- `(column-indent ,chain-column))
- ((numberp sibling-column)
- `(column-indent ,sibling-column))
- ((csharp-mode-indent--node-is-multi-line-text current-node)
- `(preserve . ,original-column))
- ((and parent-node
- (csharp-mode-indent--node-is-paren-indent parent-node))
- (let* ((paren-opener
- (tsc-node-start-byte parent-node))
- (paren-point
- (save-excursion
- (goto-char paren-opener)
- (point)))
- (beginning-of-line-point
- (save-excursion
- (goto-char paren-opener)
- (beginning-of-line 1)
- (point)))
- (paren-indenting-column
- (+ 1
- (- paren-point beginning-of-line-point))))
- `(column-indent ,paren-indenting-column)))
-
- ((or current-node-must-indent
- (and parent-node
- current-node-is-rest
- (csharp-mode-indent--node-is-indent-rest parent-node))
- (and parent-node
- current-node-is-middle-node
- (csharp-mode-indent--node-is-indent-body parent-node)))
- (if current-node-must-outdent
- 'no-indent ;; if it's an outdent, cancel
- 'indent))
- (current-node-must-outdent
- 'outdent)
- (t
- 'no-indent))))))))
-
-(defun csharp-mode-indent--node-is-outdent (node)
- "Return non-nil if NODE outdents per SCOPES.
-
-NODE is tested if it belongs into the \"outdent\" group in SCOPES."
- (let-alist csharp-mode-indent-scopes
- (member (tsc-node-type node)
- .outdent)))
-
-(defun csharp-mode-indent--updated-column (column indent)
- "Return COLUMN after added indent instructions per INDENT.
-
-INDENT is one of `csharp-mode-indent--indents-in-path'.
-
-If \"1 indent\" is to be applied, then returned value is
-CSHARP-MODE-INDENT-OFFSET + INDENT."
- (pcase indent
- (`no-indent
- column)
- (`indent
- (+ column csharp-mode-indent-offset))
- (`outdent
- (- column csharp-mode-indent-offset))
- (`(column-indent ,paren-column)
- paren-column)
- (`(preserve . ,original-column)
- original-column)
- (_
- (error "Unexpected indent instruction: %s" indent))))
-
-(cl-defun csharp-mode-indent--indent-column (original-column)
- "Return the column the first non-whitespace char at POSITION should indent
to.
-
-Collect indent instruction per AST with
-`csharp-mode-indent--indents-in-path', then apply instructions
-with `csharp-mode-indent--updated-column' using
-CSHARP-MODE-INDENT-OFFSET as step.
-
-See `csharp-mode-indent-line'. ORIGINAL-COLUMN is forwarded to
-`csharp-mode-indent--indents-in-path'"
- (let* ((indenting-node
- (csharp-mode-indent--highest-node-at-position
- (save-excursion
- (back-to-indentation)
- (point))))
- (parentwise-path (csharp-mode-indent--parentwise-path indenting-node))
- (indents-in-path
- (csharp-mode-indent--indents-in-path parentwise-path
- original-column)))
- (seq-reduce #'csharp-mode-indent--updated-column
- indents-in-path
- 0 ;; start at column 0
- )))
-
-;;;; Public API
-
-;;;###autoload
-(defun csharp-mode-indent-line ()
- "Use Tree-sitter as backend to indent current line."
- ;;Use in buffer like so:
-
- ;; (setq-local indent-line-function #'csharp-mode-indent-line).
- (let* ((original-position
- (point))
- (first-non-blank-pos ;; see savep in `smie-indent-line'
- (save-excursion
- (forward-line 0)
- (skip-chars-forward " \t")
- (point)))
- (should-save-excursion
- (< first-non-blank-pos original-position))
- (original-column
- (abs (- (line-beginning-position)
- first-non-blank-pos)))
- (new-column
- (csharp-mode-indent--indent-column original-column)))
- (when (numberp new-column)
- (if should-save-excursion
- (save-excursion (indent-line-to new-column))
- (indent-line-to new-column)))))
-
-(defun csharp-mode-indent-line-and-debug ()
- "Call `csharp-mode-indent-line' while printing useful info."
- (let* ((line-str (thing-at-point 'line))
- (position (point))
- (indenting-node (csharp-mode-indent--highest-node-at-position
- position))
- (parentwise-path (csharp-mode-indent--parentwise-path indenting-node))
- (readable-parentwise-path
- (seq-map 'tsc-node-type parentwise-path))
- (tree-sitter-tree-before (tsc-tree-to-sexp tree-sitter-tree))
- (column
- (csharp-mode-indent-line)))
- (message "csharp-mode-indent: Indented ⎡%s⎦ to ⎡%s⎦ (col %s) because of
parentwise path of ⎡%s⎦ (while looking at ⎡%s⎦ & when tree is ⎡%s⎦)"
- line-str
- (thing-at-point 'line)
- column
- readable-parentwise-path
- (tsc-node-type indenting-node)
- tree-sitter-tree-before)))
-
-;;; End of tree-sitter
-
-
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode))
@@ -1283,6 +678,7 @@ Key bindings:
(if csharp-mode-enable-tree-sitter
(progn
+ (require 'csharp-tree-sitter)
(setq-local indent-line-function #'csharp-mode-indent-line)
;; https://github.com/ubolonton/emacs-tree-sitter/issues/84
diff --git a/csharp-mode.el b/csharp-tree-sitter.el
similarity index 52%
copy from csharp-mode.el
copy to csharp-tree-sitter.el
index c6485dd..354003a 100644
--- a/csharp-mode.el
+++ b/csharp-tree-sitter.el
@@ -1,4 +1,4 @@
-;;; csharp-mode.el --- C# mode derived mode -*- lexical-binding: t; -*-
+;;; csharp-tree-sitter.el --- tree sitter support for C# -*- lexical-binding:
t; -*-
;; Author : Theodor Thornhill <theo@thornhill.no>
;; Maintainer : Jostein Kjønigsen <jostein@gmail.com>
@@ -8,7 +8,6 @@
;; Version : 0.10.0
;; Keywords : c# languages oop mode
;; X-URL : https://github.com/josteink/csharp-mode
-;; Package-Requires: ((emacs "26.1") (tree-sitter "0.12.1") (seq "2.21"))
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -30,639 +29,9 @@
(require 'tree-sitter)
(require 'tree-sitter-hl)
-(when (version< emacs-version "25.1")
- (require 'cl))
-(require 'cc-mode)
-(require 'cc-langs)
-
-(eval-when-compile
- (require 'cc-fonts))
-
-(require 'compile)
-
-(defgroup csharp nil
- "Major mode for editing C# code."
- :group 'prog-mode)
-
-
-(eval-and-compile
- (defconst csharp--regex-identifier
- "[A-Za-z][A-Za-z0-9_]*"
- "Regex describing an dentifier in C#.")
-
- (defconst csharp--regex-identifier-matcher
- (concat "\\(" csharp--regex-identifier "\\)")
- "Regex matching an identifier in C#.")
-
- (defconst csharp--regex-type-name
- "[A-Z][A-Za-z0-9_]*"
- "Regex describing a type identifier in C#.")
-
- (defconst csharp--regex-type-name-matcher
- (concat "\\(" csharp--regex-type-name "\\)")
- "Regex matching a type identifier in C#.")
-
- (defconst csharp--regex-using-or-namespace
- (concat "^using" "\\|" "namespace"
- "\\s *"
- csharp--regex-type-name-matcher)
- "Regex matching identifiers after a using or namespace
- declaration."))
-
-(eval-and-compile
- (c-add-language 'csharp-mode 'java-mode))
-
-(c-lang-defconst c-make-mode-syntax-table
- csharp `(lambda ()
- (let ((table (make-syntax-table)))
- (c-populate-syntax-table table)
- (modify-syntax-entry ?@ "_" table)
- table)))
-
-(c-lang-defconst c-identifier-syntax-modifications
- csharp (append '((?@ . "w"))
- (c-lang-const c-identifier-syntax-modifications)))
-
-(c-lang-defconst c-symbol-start
- csharp (concat "[" c-alpha "_@]"))
-
-(c-lang-defconst c-opt-type-suffix-key
- csharp (concat "\\(\\[" (c-lang-const c-simple-ws) "*\\]\\|\\?\\)"))
-
-(c-lang-defconst c-identifier-ops
- csharp '((left-assoc ".")))
-
-(c-lang-defconst c-overloadable-operators
- csharp '("+" "-" "*" "/" "%" "&" "|" "^" "<<" ">>" "=="
- "!=" ">" "<" ">=" "<="))
-
-(c-lang-defconst c-multiline-string-start-char
- csharp ?@)
-
-(c-lang-defconst c-type-prefix-kwds
- csharp '("class" "interface" "struct"))
-
-(c-lang-defconst c-class-decl-kwds
- csharp '("class" "interface" "struct"))
-
-;;; Keyword lists
-
-(c-lang-defconst c-primitive-type-kwds
- csharp '("bool" "byte" "sbyte" "char" "decimal" "double" "float" "int" "uint"
- "long" "ulong" "short" "ushort" "void" "object" "string" "var"))
-
-(c-lang-defconst c-other-decl-kwds
- csharp nil)
-
-(c-lang-defconst c-type-list-kwds
- csharp nil)
-
-(c-lang-defconst c-other-block-decl-kwds
- csharp nil)
-
-(c-lang-defconst c-return-kwds
- csharp '("return"))
-
-(c-lang-defconst c-typedef-kwds
- csharp nil)
-
-(c-lang-defconst c-typeof-kwds
- csharp '("typeof" "is" "as"))
-
-(c-lang-defconst c-type-modifier-prefix-kwds
- csharp '("volatile"))
-
-(c-lang-defconst c-type-modifier-kwds
- csharp '("readonly" "new"))
-
-(c-lang-defconst c-brace-list-decl-kwds
- csharp '("enum" "new"))
-
-(c-lang-defconst c-recognize-post-brace-list-type-p
- csharp t)
-
-(c-lang-defconst c-ref-list-kwds
- csharp nil)
-
-(c-lang-defconst c-using-kwds
- csharp '("using"))
-
-(c-lang-defconst c-equals-type-clause-kwds
- csharp '("using"))
-
-(defun csharp-at-vsemi-p (&optional pos)
- (if pos (goto-char pos))
- (save-excursion
- (beginning-of-line)
- (c-forward-syntactic-ws)
- (looking-at "using\\s *(")))
-
-(c-lang-defconst c-at-vsemi-p-fn
- csharp 'csharp-at-vsemi-p)
-
-(defun csharp-vsemi-status-unknown () t)
-
-(c-lang-defconst c-vsemi-status-unknown-p-fn
- csharp 'csharp-vsemi-status-unknown-p)
-
-
-(c-lang-defconst c-modifier-kwds
- csharp '("abstract" "default" "final" "native" "private" "protected"
- "public" "partial" "internal" "readonly" "static" "event" "transient"
- "volatile" "sealed" "ref" "out" "virtual" "implicit" "explicit"
- "fixed" "override" "params" "async" "await" "extern" "unsafe"
- "get" "set" "this" "const" "delegate"))
-
-(c-lang-defconst c-other-kwds
- csharp '("select" "from" "where" "join" "in" "on" "equals" "into"
- "orderby" "ascending" "descending" "group" "when"
- "let" "by" "namespace"))
-
-(c-lang-defconst c-colon-type-list-kwds
- csharp '("class" "struct" "interface"))
-
-(c-lang-defconst c-block-stmt-1-kwds
- csharp '("do" "else" "finally" "try"))
-
-(c-lang-defconst c-block-stmt-1-2-kwds
- csharp '("try"))
-
-(c-lang-defconst c-block-stmt-2-kwds
- csharp '("for" "if" "switch" "while" "catch" "foreach" "fixed" "checked"
- "unchecked" "using" "lock"))
-
-(c-lang-defconst c-simple-stmt-kwds
- csharp '("break" "continue" "goto" "throw" "return" "yield"))
-
-(c-lang-defconst c-constant-kwds
- csharp '("true" "false" "null" "value"))
-
-(c-lang-defconst c-primary-expr-kwds
- csharp '("this" "base" "operator"))
-
-(c-lang-defconst c-inexpr-class-kwds
- csharp nil)
-
-(c-lang-defconst c-class-decl-kwds
- csharp '("class" "struct" "interface"))
-
-(c-lang-defconst c-std-abbrev-keywords
- csharp (append (c-lang-const c-std-abbrev-keywords) '("catch" "finally")))
-
-(c-lang-defconst c-decl-prefix-re
- csharp "\\([{}(;,<]+\\)")
-
-(c-lang-defconst c-recognize-typeless-decls
- csharp t)
-
-(c-lang-defconst c-recognize-<>-arglists
- csharp t)
-
-(c-lang-defconst c-opt-cpp-prefix
- csharp "\\s *#\\s *")
-
-(c-lang-defconst c-opt-cpp-macro-define
- csharp (if (c-lang-const c-opt-cpp-prefix)
- "define"))
-
-(c-lang-defconst c-cpp-message-directives
- csharp '("error" "warning" "region"))
-
-(c-lang-defconst c-cpp-expr-directives
- csharp '("if" "elif"))
-
-(c-lang-defconst c-other-op-syntax-tokens
- csharp (append '("#")
- (c-lang-const c-other-op-syntax-tokens)))
-
-(c-lang-defconst c-line-comment-starter
- csharp "//")
-
-(c-lang-defconst c-doc-comment-start-regexp
- csharp "///")
-
-(c-add-style "csharp"
- '("java"
- (c-basic-offset . 4)
- (c-comment-only-line-offset . (0 . 0))
- (c-offsets-alist . ((inline-open . 0)
- (arglist-intro . +)
- (arglist-close . 0)
- (inexpr-class . 0)
- (case-label . +)
- (cpp-macro .
c-lineup-dont-change)
- (substatement-open . 0)))))
-
-(eval-and-compile
- (unless (assoc 'csharp-mode c-default-style)
- (setq c-default-style
- (cons '(csharp-mode . "csharp")
- c-default-style))))
-
-(defun csharp--color-forwards (font-lock-face)
- (let (id-beginning)
- (goto-char (match-beginning 0))
- (forward-word)
- (while (and (not (or (eq (char-after) ?\;)
- (eq (char-after) ?\{)))
- (progn
- (forward-char)
- (c-forward-syntactic-ws)
- (setq id-beginning (point))
- (> (skip-chars-forward
- (c-lang-const c-symbol-chars))
- 0))
- (not (get-text-property (point) 'face)))
- (c-put-font-lock-face id-beginning (point) font-lock-face)
- (c-forward-syntactic-ws))))
-
-(c-lang-defconst c-basic-matchers-before
- csharp `(
- ;; Warning face on unclosed strings
- ,@(if (version< emacs-version "27.0")
- ;; Taken from 26.1 branch
- `(,(c-make-font-lock-search-function
- (concat ".\\(" c-string-limit-regexp "\\)")
- '((c-font-lock-invalid-string))))
- `(("\\s|" 0 font-lock-warning-face t nil)))
-
- ;; Invalid single quotes
- c-font-lock-invalid-single-quotes
-
- ;; Keyword constants
- ,@(when (c-lang-const c-constant-kwds)
- (let ((re (c-make-keywords-re nil (c-lang-const
c-constant-kwds))))
- `((eval . (list ,(concat "\\<\\(" re "\\)\\>")
- 1 c-constant-face-name)))))
-
- ;; Keywords except the primitive types.
- ,`(,(concat "\\<" (c-lang-const c-regular-keywords-regexp))
- 1 font-lock-keyword-face)
-
- ;; Chained identifiers in using/namespace statements
- ,`(,(c-make-font-lock-search-function
- csharp--regex-using-or-namespace
- `((csharp--color-forwards font-lock-variable-name-face)
- nil
- (goto-char (match-end 0)))))
-
-
- ;; Negation character
- (eval . (list "\\(!\\)[^=]" 1 c-negation-char-face-name))
-
- ;; Types after 'new'
- (eval . (list (concat "\\<new\\> *" csharp--regex-type-name-matcher)
- 1 font-lock-type-face))
-
- ;; Single identifier in attribute
- (eval . (list (concat "\\[" csharp--regex-type-name-matcher
"\\][^;]")
- 1 font-lock-variable-name-face t))
-
- ;; Function names
- (eval . (list "\\([A-Za-z0-9_]+\\)\\(<[a-zA-Z0-9, ]+>\\)?("
- 1 font-lock-function-name-face))
-
- ;; Nameof
- (eval . (list (concat "\\(\\<nameof\\>\\) *(")
- 1 font-lock-function-name-face))
-
- (eval . (list (concat "\\<nameof\\> *( *"
- csharp--regex-identifier-matcher
- " *) *")
- 1 font-lock-variable-name-face))
-
- ;; Catch statements with type only
- (eval . (list (concat "\\<catch\\> *( *"
- csharp--regex-type-name-matcher
- " *) *")
- 1 font-lock-type-face))
- ))
-
-(c-lang-defconst c-basic-matchers-after
- csharp (append
- ;; Merge with cc-mode defaults - enables us to add more later
- (c-lang-const c-basic-matchers-after)))
-
-(defcustom csharp-codedoc-tag-face 'c-doc-markup-face-name
- "Face to be used on the codedoc docstring tags.
-Should be one of the font lock faces, such as
-`font-lock-variable-name-face' and friends.
-Needs to be set before `csharp-mode' is loaded, because of
-compilation and evaluation time conflicts."
- :type 'symbol
- :group 'csharp)
-
-(defcustom csharp-font-lock-extra-types
- (list csharp--regex-type-name)
- (c-make-font-lock-extra-types-blurb "C#" "csharp-mode" (concat))
- :type 'c-extra-types-widget
- :group 'c)
-
-(defconst csharp-font-lock-keywords-1 (c-lang-const c-matchers-1 csharp)
- "Minimal font locking for C# mode.")
-
-(defconst csharp-font-lock-keywords-2 (c-lang-const c-matchers-2 csharp)
- "Fast normal font locking for C# mode.")
-
-(defconst csharp-font-lock-keywords-3 (c-lang-const c-matchers-3 csharp)
- "Accurate normal font locking for C# mode.")
-
-(defvar csharp-font-lock-keywords csharp-font-lock-keywords-3
- "Default expressions to highlight in C# mode.")
-
-(defun csharp-font-lock-keywords-2 ()
- (c-compose-keywords-list csharp-font-lock-keywords-2))
-(defun csharp-font-lock-keywords-3 ()
- (c-compose-keywords-list csharp-font-lock-keywords-3))
-(defun csharp-font-lock-keywords ()
- (c-compose-keywords-list csharp-font-lock-keywords))
-
-
-;;; Doc comments
-
-(defconst codedoc-font-lock-doc-comments
- ;; Most of this is taken from the javadoc example, however, we don't use the
- ;; '@foo' syntax, so I removed that. Supports the XML tags only
- `((,(concat "</?\\sw" ; XML tags.
- "\\("
- (concat "\\sw\\|\\s \\|[=\n\r*.:]\\|"
- "\"[^\"]*\"\\|'[^']*'")
- "\\)*/?>")
- 0 ,csharp-codedoc-tag-face prepend nil)
- ;; ("\\([a-zA-Z0-9_]+\\)=" 0 font-lock-variable-name-face prepend nil)
- ;; ("\".*\"" 0 font-lock-string-face prepend nil)
- ("&\\(\\sw\\|[.:]\\)+;" ; XML entities.
- 0 ,csharp-codedoc-tag-face prepend nil)))
-
-(defconst codedoc-font-lock-keywords
- `((,(lambda (limit)
- (c-font-lock-doc-comments "///" limit
- codedoc-font-lock-doc-comments)))))
-
-;;; End of doc comments
-
-;;; Adding syntax constructs
-
-(advice-add 'c-looking-at-inexpr-block
- :around 'csharp-looking-at-inexpr-block)
-
-(defun csharp-looking-at-inexpr-block (orig-fun &rest args)
- (let ((res (csharp-at-lambda-header)))
- (if res
- res
- (apply orig-fun args))))
-
-(defun csharp-at-lambda-header ()
- (save-excursion
- (c-backward-syntactic-ws)
- (unless (bobp)
- (backward-char)
- (c-safe (goto-char (scan-sexps (point) -1)))
- (when (or (looking-at "([[:alnum:][:space:]_,]*)[ \t\n]*=>[ \t\n]*{")
- (looking-at "[[:alnum:]_]+[ \t\n]*=>[ \t\n]*{"))
- ;; If we are at a C# lambda header
- (cons 'inexpr (point))))))
-
-(advice-add 'c-guess-basic-syntax
- :around 'csharp-guess-basic-syntax)
-
-(defun csharp-guess-basic-syntax (orig-fun &rest args)
- (cond
- (;; Attributes
- (save-excursion
- (goto-char (c-point 'iopl))
- (and
- (eq (char-after) ?\[)
- (save-excursion
- (c-go-list-forward)
- (and (eq (char-before) ?\])
- (not (eq (char-after) ?\;))))))
- `((annotation-top-cont ,(c-point 'iopl))))
-
- ((and
- ;; Heuristics to find object initializers
- (save-excursion
- ;; Next non-whitespace character should be '{'
- (goto-char (c-point 'boi))
- (eq (char-after) ?{))
- (save-excursion
- ;; 'new' should be part of the line
- (goto-char (c-point 'iopl))
- (looking-at ".*\\s *new\\s *.*"))
- ;; Line should not already be terminated
- (save-excursion
- (goto-char (c-point 'eopl))
- (or (not (eq (char-before) ?\;))
- (not (eq (char-before) ?\{)))))
- (if (save-excursion
- ;; if we have a hanging brace on line before
- (goto-char (c-point 'eopl))
- (eq (char-before) ?\{))
- `((brace-list-intro ,(c-point 'iopl)))
- `((block-open) (statement ,(c-point 'iopl)))))
- (t
- (apply orig-fun args))))
-
-;;; End of new syntax constructs
-
-
-
-;;; Fix for strings on version 27.1
-
-(when (version= emacs-version "27.1")
- ;; See:
- ;; https://github.com/josteink/csharp-mode/issues/175
- ;; https://github.com/josteink/csharp-mode/issues/151
- ;; for the full story.
- (defun c-pps-to-string-delim (end)
- (let* ((start (point))
- (no-st-s `(0 nil nil ?\" nil nil 0 nil ,start nil nil))
- (st-s `(0 nil nil t nil nil 0 nil ,start nil nil))
- no-st-pos st-pos
- )
- (parse-partial-sexp start end nil nil no-st-s 'syntax-table)
- (setq no-st-pos (point))
- (goto-char start)
- (while (progn
- (parse-partial-sexp (point) end nil nil st-s 'syntax-table)
- (unless (bobp)
- (c-clear-syn-tab (1- (point))))
- (setq st-pos (point))
- (and (< (point) end)
- (not (eq (char-before) ?\")))))
- (goto-char (min no-st-pos st-pos))
- nil))
-
- (defun c-multiline-string-check-final-quote ()
- (let (pos-ll pos-lt)
- (save-excursion
- (goto-char (point-max))
- (skip-chars-backward "^\"")
- (while
- (and
- (not (bobp))
- (cond
- ((progn
- (setq pos-ll (c-literal-limits)
- pos-lt (c-literal-type pos-ll))
- (memq pos-lt '(c c++)))
- ;; In a comment.
- (goto-char (car pos-ll)))
- ((save-excursion
- (backward-char) ; over "
- (c-is-escaped (point)))
- ;; At an escaped string.
- (backward-char)
- t)
- (t
- ;; At a significant "
- (c-clear-syn-tab (1- (point)))
- (setq pos-ll (c-literal-limits)
- pos-lt (c-literal-type pos-ll))
- nil)))
- (skip-chars-backward "^\""))
- (cond
- ((bobp))
- ((eq pos-lt 'string)
- (c-put-syn-tab (1- (point)) '(15)))
- (t nil))))))
-
-;;; End of fix for strings on version 27.1
-
-
-
-(defvar csharp-mode-syntax-table
- (funcall (c-lang-const c-make-mode-syntax-table csharp))
- "Syntax table used in csharp-mode buffers.")
-
-(defvar csharp-mode-map
- (let ((map (c-make-inherited-keymap)))
- map)
- "Keymap used in csharp-mode buffers.")
-
-(easy-menu-define csharp-mode-menu csharp-mode-map "C# Mode Commands"
- (cons "C#" (c-lang-const c-mode-menu csharp)))
-
-
-;;; Compilation support
-;; When invoked by MSBuild, csc’s errors look like this:
-;; subfolder\file.cs(6,18): error CS1006: Name of constructor must
-;; match name of class [c:\Users\user\project.csproj]
-
-(defun csharp--compilation-error-file-resolve ()
- "Resolve an msbuild error to a (filename . dirname) cons cell."
- ;; http://stackoverflow.com/a/18049590/429091
- (cons (match-string 1) (file-name-directory (match-string 4))))
-
-(defconst csharp-compilation-re-msbuild-error
- (concat
- "^[[:blank:]]*\\(?:[[:digit:]]+>\\)?"
- "\\([^(\r\n)]+\\)(\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)?): "
- "error [[:alnum:]]+: [^\r\n]+\\[\\([^]\r\n]+\\)\\]$")
- "Regexp to match compilation error from msbuild.")
-
-(defconst csharp-compilation-re-msbuild-warning
- (concat
- "^[[:blank:]]*\\(?:[[:digit:]]+>\\)?"
- "\\([^(\r\n)]+\\)(\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)?): "
- "warning [[:alnum:]]+: [^\r\n]+\\[\\([^]\r\n]+\\)\\]$")
- "Regexp to match compilation warning from msbuild.")
-
-;; Notes on xbuild and devenv commonalities
-;;
-;; These regexes were tailored for xbuild, but apart from the concurrent
-;; build-marker ("1>") they share exactly the same match-markers.
-;;
-;; If we don't exclude the match-markers explicitly, these regexes
-;; will also be used to match for devenv as well, including the build-marker
-;; in the file-name, causing the lookup to fail.
-;;
-;; So if we don't want devenv to fail, we actually need to handle it in our
-;; xbuild-regexes, but then we automatically get devenv-support for free.
-
-(defconst csharp-compilation-re-xbuild-error
- (concat
- "^[[:blank:]]*\\(?:[[:digit:]]+>\\)?"
- "\\([^(\r\n)]+\\)(\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)?"
- ;; handle weird devenv output format with 4 numbers, not 2 by having
optional
- ;; extra capture-groups.
- "\\(?:,\\([0-9]+\\)\\)*): "
- "error [[:alnum:]]+: .+$")
- "Regexp to match compilation error from xbuild.")
-
-(defconst csharp-compilation-re-xbuild-warning
- (concat
- "^[[:blank:]]*\\(?:[[:digit:]]+>\\)?"
- "\\([^(\r\n)]+\\)(\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)?"
- ;; handle weird devenv output format with 4 numbers, not 2 by having
optional
- ;; extra capture-groups.
- "\\(?:,\\([0-9]+\\)\\)?*): "
- "warning [[:alnum:]]+: .+$")
- "Regexp to match compilation warning from xbuild.")
-
-(defconst csharp-compilation-re-dotnet-error
- "\\([^\r\n]+\\) : error [A-Z]+[0-9]+:")
-
-(defconst csharp-compilation-re-dotnet-warning
- "\\([^\r\n]+\\) : warning [A-Z]+[0-9]+:")
-
-(defconst csharp-compilation-re-dotnet-testfail
- (concat
- "^[[:blank:]]+X \\(?:.+\n\\)"
- "[[:blank:]]+Error Message:\n"
- "[[:blank:]]+\\(?:.+\n\\)"
- "\\(?:^Expected: \\(?:.+\n\\)\\)?"
- "\\(?:^Actual: \\(?:.+\n\\)\\)?"
- "[[:blank:]]+Stack Trace:\n"
- "[[:blank:]]+at [^\n]+ in \\([^\n]+\\):line \\([0-9]+\\)"))
-
-
-(eval-after-load 'compile
- (lambda ()
- (dolist
- (regexp
- `((dotnet-testfail
- ,csharp-compilation-re-dotnet-testfail
- 1 2)
- (xbuild-error
- ,csharp-compilation-re-xbuild-error
- 1 2 3 2)
- (xbuild-warning
- ,csharp-compilation-re-xbuild-warning
- 1 2 3 1)
- (msbuild-error
- ,csharp-compilation-re-msbuild-error
- csharp--compilation-error-file-resolve
- 2
- 3
- 2
- nil
- (1 compilation-error-face)
- (4 compilation-error-face))
- (msbuild-warning
- ,csharp-compilation-re-msbuild-warning
- csharp--compilation-error-file-resolve
- 2
- 3
- 1
- nil
- (1 compilation-warning-face)
- (4 compilation-warning-face))
- (dotnet-error
- ,csharp-compilation-re-dotnet-error
- 1)
- (dotnet-warning
- ,csharp-compilation-re-dotnet-warning
- 1 nil nil 1)))
- (add-to-list 'compilation-error-regexp-alist-alist regexp)
- (add-to-list 'compilation-error-regexp-alist (car regexp)))))
;;; Tree-sitter
-(defcustom csharp-mode-enable-tree-sitter nil
- "Use tree sitter for font locking and indentation."
- :type 'boolean)
-
(defvar-local csharp-mode-tree-sitter-patterns
[ ;; Various constructs
(comment) @comment
@@ -1262,47 +631,6 @@ See `csharp-mode-indent-line'. ORIGINAL-COLUMN is
forwarded to
;;; End of tree-sitter
+(provide 'csharp-tree-sitter)
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode))
-
-;;;###autoload
-(defcustom csharp-mode-hook nil
- "*Hook called by `csharp-mode'."
- :type 'hook
- :group 'csharp)
-
-;;;###autoload
-(define-derived-mode csharp-mode prog-mode "C#"
- "Major mode for editing Csharp code.
-
-Key bindings:
-\\{csharp-mode-map}"
- :group 'csharp
-
- (if csharp-mode-enable-tree-sitter
- (progn
- (setq-local indent-line-function #'csharp-mode-indent-line)
-
- ;; https://github.com/ubolonton/emacs-tree-sitter/issues/84
- (unless font-lock-defaults
- (setq font-lock-defaults '(nil)))
- (setq-local tree-sitter-hl-default-patterns
csharp-mode-tree-sitter-patterns)
- ;; Comments
- (setq-local comment-start "// ")
- (setq-local comment-end "")
-
- (tree-sitter-hl-mode))
- (progn
- :after-hook (c-update-modeline)
- (c-initialize-cc-mode t)
- (c-init-language-vars csharp-mode)
- (c-common-init 'csharp-mode)
- (easy-menu-add csharp-mode-menu)
- (setq-local c-doc-comment-style '((csharp-mode . codedoc)))
- (c-run-mode-hooks 'c-mode-common-hook 'csharp-mode-hook))))
-
-(provide 'csharp-mode)
-
-;;; csharp-mode.el ends here
+;;; csharp-tree-sitter.el ends here
- [elpa] externals/csharp-mode 512c858 386/459: Start extracting defcustoms, (continued)
- [elpa] externals/csharp-mode 512c858 386/459: Start extracting defcustoms, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode f94e5a7 387/459: More extracting, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 323a028 388/459: More cleaning, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 84a5daa 389/459: Should not need to autoload c_sharp, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 4651004 391/459: Hassle with the defcustoms, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 5ac7484 392/459: Add back better support for interfaces, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 4eef364 394/459: Absorb tree-sitter-indent, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 8fdeedf 397/459: Indentation tweaking, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 3d0b60c 399/459: Add a little documentation, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 0de2bbc 400/459: Fix byte compilation errors, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 5730c99 401/459: Split functionality to two files,
ELPA Syncer <=
- [elpa] externals/csharp-mode 4eeccbd 402/459: Remove newly added tests, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 1e37eaf 407/459: Add dependency to tree-sitter-indent, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 00a3cd4 410/459: Add new url to csharp-tree-sitter.el, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 91d5161 414/459: Minor fix after version 0.11.0 (#209), ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 8466428 413/459: Version bump to 0.11.0, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 84ff0d0 415/459: Typo from PR-209., ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode 74644d4 416/459: Merge pull request #210 from emacs-csharp/minor, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode d3b5b18 419/459: Ensure langs package for tree-sitter support (#214), ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode da26eb6 420/459: Add mode map and syntax table to tree-sitter, ELPA Syncer, 2021/08/22
- [elpa] externals/csharp-mode a402402 421/459: Add lock_statement, ELPA Syncer, 2021/08/22