Add 'vendor/tree-sitter-c-sharp/' from commit '4a3d9677f86aab13b7e721df22e12004416e2539'

git-subtree-dir: vendor/tree-sitter-c-sharp
git-subtree-mainline: 5991efdcc7
git-subtree-split: 4a3d9677f8
edge_only_predecessors
Wilfred Hughes 2021-09-22 22:12:22 +07:00
commit 806f925948
49 changed files with 575637 additions and 0 deletions

@ -0,0 +1,4 @@
/src/** linguist-vendored
/scripts/** text eol=lf
/src/parser.c -diff
/src/grammar.json -diff

@ -0,0 +1,37 @@
name: build
on:
push:
pull_request:
branches:
- "**" # Don't trust forks because miners
jobs:
build:
name: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Node
uses: actions/setup-node@v2-beta
with:
node-version: '12'
- name: Display Node versions
run: |
node --version
npm --version
- name: Install dependencies
run: npm install
- name: Test corpus
run: npm test
- name: Parse examples
run: |
PATH=$(npm bin):$PATH
script/fetch-examples
script/parse-examples

@ -0,0 +1,12 @@
Cargo.lock
node_modules
build
npm-debug.log
package-lock.json
parser.exp
parser.lib
parser.obj
examples
!examples/.gitkeep
scanner.obj
/target/

@ -0,0 +1,6 @@
examples
corpus
build
.travis.yml
appveyor.yml
target

@ -0,0 +1,35 @@
[package]
name = "tree-sitter-c-sharp"
description = "C# grammar for the tree-sitter parsing library"
version = "0.19.0"
authors = [
"Max Brunsfeld <maxbrunsfeld@gmail.com>",
"Noelle Caldwell <noelle.caldwell@microsoft.com>",
"Douglas Creager <dcreager@dcreager.net>",
"Damien Guard <damieng@gmail.com>",
"Martin Midtgaard <martin.midtgaard@gmail.com>",
"Patrick Thomson <patrickt@github.com>",
]
license = "MIT"
readme = "bindings/rust/README.md"
keywords = ["incremental", "parsing", "c-sharp"]
categories = ["parsing", "text-editors"]
repository = "https://github.com/tree-sitter/tree-sitter-c-sharp"
edition = "2018"
build = "bindings/rust/build.rs"
include = [
"bindings/rust/*",
"grammar.js",
"queries/*",
"src/*",
]
[lib]
path = "bindings/rust/lib.rs"
[dependencies]
tree-sitter = "0.19"
[build-dependencies]
cc = "1.0"

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Max Brunsfeld
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,106 @@
# tree-sitter-c-sharp
[![Build Status](https://github.com/tree-sitter/tree-sitter-c-sharp/workflows/build/badge.svg)](https://github.com/tree-sitter/tree-sitter-c-sharp/actions?query=workflow%3Abuild)
C# grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter) based on an export of the Roslyn grammar export with various changes in order to:
- Deal with differences between the parsing technologies
- Work around some bugs in that grammar
- Handle `#if`, `#else`, `#elif`, `#endif` blocks
- Support syntax highlighting/parsing of fragments
- Simplify the output tree
### Status
Comprehensive support for C# exists with the following exceptions:
- [ ] `async`, `var` and `await` cannot be used as identifiers
#### C# 7.0 (complete)
- [x] Tuples
- [x] Discards
- [x] Basic pattern matching
- [x] Recursive pattern matching
- [x] Ref locals and return
- [x] Local function statements
- [x] Expression bodied constructors
- [x] Expression bodied destructors/finalizers
- [x] Throw expressions
- [x] Binary and `_` literal support
#### C# 7.1 (complete)
- [x] `async` main method
- [x] Default literals (as `default_expression`)
- [x] Inferred tuple element names
- [x] Generic type pattern matching
#### C# 7.2 (complete)
- [x] `in` parameter modifiers
- [x] `ref readonly` method returns
- [x] `readonly struct`
- [x] `ref struct`
- [x] Non-named trailing arguments
- [x] `_` leading binary and hex literals
- [x] `private protected` modifier
- [x] Conditional `ref` expressions
#### C# 7.3 (complete)
- [x] `stackalloc` array initializers
- [x] `unmanaged` generic type parameter constraint
- [x] Attributes attached to auto property backing fields
- [x] `out` support for parameters on initializers, constructors etc.
#### C# 8.0 (complete)
- [x] `readonly` members
- [x] Default interface methods
- [x] `switch` expressions
- [x] `switch` property patterns
- [x] `switch` tuple patterns
- [x] `static` local functions
- [x] Nullable reference types
- [x] Null-forgiving operator
- [x] Null-coalescing assignment
#### C# 9.0 (complete)
- [x] Covariant returns
- [x] Extending partial methods
- [x] Extension GetEnumerator
- [x] Function pointers
- [x] Init properties
- [x] Lambda discard parameters
- [x] Local function attributes
- [x] Module initializers
- [x] Native integers
- [x] Patterns
- [x] Simple type patterns
- [x] Relational patterns
- [x] Logical patterns
- [x] Records
- [x] Skip Locals Init
- [x] Static anonymous functions
- [x] Target-typed conditional expression
- [x] Target-typed new
- [x] Top-level statements
#### C# 10.0
- [x] global using directives
- [x] File-scoped namespace declaration
- [x] Extended property patterns
- [x] Allow const interpolated strings
- [x] Record types can seal ToString()
- [x] Allow both assignment and declaration in the same deconstruction
- [x] Allow AsyncMethodBuilder attribute on methods
- [x] Record structs
### References
- [Official C# 6 Language Spec](https://github.com/dotnet/csharplang/blob/master/spec/) provides chapters that formally define the language grammar.
- [Roslyn C# language grammar export](https://github.com/dotnet/roslyn/blob/master/src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4)
- [SharpLab](https://sharplab.io) (web-based syntax tree playground based on Roslyn)

@ -0,0 +1,19 @@
{
"targets": [
{
"target_name": "tree_sitter_c_sharp_binding",
"include_dirs": [
"<!(node -e \"require('nan')\")",
"src"
],
"sources": [
"src/parser.c",
"src/scanner.c",
"bindings/node/binding.cc"
],
"cflags_c": [
"-std=c99",
]
}
]
}

@ -0,0 +1,28 @@
#include "tree_sitter/parser.h"
#include <node.h>
#include "nan.h"
using namespace v8;
extern "C" TSLanguage * tree_sitter_c_sharp();
namespace {
NAN_METHOD(New) {}
void Init(Local<Object> exports, Local<Object> module) {
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked();
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_c_sharp());
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("c_sharp").ToLocalChecked());
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
}
NODE_MODULE(tree_sitter_c_sharp_binding, Init)
} // namespace

@ -0,0 +1,19 @@
try {
module.exports = require("../../build/Release/tree_sitter_c_sharp_binding");
} catch (error1) {
if (error1.code !== 'MODULE_NOT_FOUND') {
throw error1;
}
try {
module.exports = require("../../build/Debug/tree_sitter_c_sharp_binding");
} catch (error2) {
if (error2.code !== 'MODULE_NOT_FOUND') {
throw error2;
}
throw error1
}
}
try {
module.exports.nodeTypeInfo = require("../../src/node-types.json");
} catch (_) {}

@ -0,0 +1,37 @@
# tree-sitter-c-sharp
This crate provides a C# grammar for the [tree-sitter][] parsing library. To
use this crate, add it to the `[dependencies]` section of your `Cargo.toml`
file. (Note that you will probably also need to depend on the
[`tree-sitter`][tree-sitter crate] crate to use the parsed result in any useful
way.)
``` toml
[dependencies]
tree-sitter = "0.17"
tree-sitter-c-sharp = "0.16"
```
Typically, you will use the [language][language func] function to add this
grammar to a tree-sitter [Parser][], and then use the parser to parse some code:
``` rust
let code = r#"
class Test {
int double(int x) => x * 2;
}
"#;
let mut parser = Parser::new();
parser.set_language(tree_sitter_c_sharp::language()).expect("Error loading C# grammar");
let parsed = parser.parse(code, None);
```
If you have any questions, please reach out to us in the [tree-sitter
discussions] page.
[Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
[language func]: https://docs.rs/tree-sitter-c-sharp/*/tree_sitter_c_sharp/fn.language.html
[Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
[tree-sitter]: https://tree-sitter.github.io/
[tree-sitter crate]: https://crates.io/crates/tree-sitter
[tree-sitter discussions]: https://github.com/tree-sitter/tree-sitter/discussions

@ -0,0 +1,19 @@
use std::path::Path;
extern crate cc;
fn main() {
let src_dir = Path::new("src");
let mut c_config = cc::Build::new();
c_config.include(&src_dir);
c_config
.flag_if_supported("-Wno-unused-parameter")
.flag_if_supported("-Wno-unused-but-set-variable")
.flag_if_supported("-Wno-trigraphs");
let parser_path = src_dir.join("parser.c");
c_config.file(&parser_path);
let scanner_path = src_dir.join("scanner.c");
c_config.file(&scanner_path);
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
c_config.compile("parser-scanner");
}

@ -0,0 +1,66 @@
// -*- coding: utf-8 -*-
// ------------------------------------------------------------------------------------------------
// Copyright © 2020, tree-sitter-c-sharp authors.
// See the LICENSE file in this repo for license details.
// ------------------------------------------------------------------------------------------------
//! This crate provides a C# grammar for the [tree-sitter][] parsing library.
//!
//! Typically, you will use the [language][language func] function to add this grammar to a
//! tree-sitter [Parser][], and then use the parser to parse some code:
//!
//! ```
//! use tree_sitter::Parser;
//!
//! let code = r#"
//! class Test {
//! int double(int x) => x * 2;
//! }
//! "#;
//! let mut parser = Parser::new();
//! parser.set_language(tree_sitter_c_sharp::language()).expect("Error loading C# grammar");
//! let parsed = parser.parse(code, None);
//! # let parsed = parsed.unwrap();
//! # let root = parsed.root_node();
//! # assert!(!root.has_error());
//! ```
//!
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
//! [language func]: fn.language.html
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
//! [tree-sitter]: https://tree-sitter.github.io/
use tree_sitter::Language;
extern "C" {
fn tree_sitter_c_sharp() -> Language;
}
/// Returns the tree-sitter [Language][] for this grammar.
///
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
pub fn language() -> Language {
unsafe { tree_sitter_c_sharp() }
}
/// The source of the C# tree-sitter grammar description.
pub const GRAMMAR: &'static str = include_str!("../../grammar.js");
/// The content of the [`node-types.json`][] file for this grammar.
///
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
/// The symbol tagging query for this language.
pub const TAGGING_QUERY: &'static str = include_str!("../../queries/tags.scm");
#[cfg(test)]
mod tests {
#[test]
fn can_load_grammar() {
let mut parser = tree_sitter::Parser::new();
parser
.set_language(super::language())
.expect("Error loading C# grammar");
}
}

@ -0,0 +1,318 @@
=======================================
Global attributes
=======================================
[assembly: Single]
[module: A, C()]
---
(compilation_unit
(global_attribute_list (attribute (identifier)))
(global_attribute_list
(attribute (identifier))
(attribute (identifier) (attribute_argument_list))))
=======================================
Attributes with arguments
=======================================
[A(B.C)]
class D {}
---
(compilation_unit
(class_declaration
(attribute_list
(attribute
(identifier)
(attribute_argument_list
(attribute_argument (member_access_expression (identifier) (identifier))))))
(identifier)
(declaration_list)))
=======================================
Attributes with qualified name
=======================================
[NS.A(B.C)]
class D {}
---
(compilation_unit
(class_declaration
(attribute_list
(attribute
(qualified_name (identifier) (identifier))
(attribute_argument_list
(attribute_argument (member_access_expression (identifier) (identifier))))))
(identifier)
(declaration_list)))
=======================================
Attributes on classes
=======================================
[Single]
class A { }
[One][Two]
[Three]
class A { }
[One]
[Two,Three()]
class A { }
---
(compilation_unit
(class_declaration
(attribute_list (attribute (identifier)))
(identifier)
(declaration_list))
(class_declaration
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)))
(identifier)
(declaration_list))
(class_declaration
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(identifier)
(declaration_list)))
=======================================
Attributes on structs
=======================================
[A,B()][C]
struct A { }
---
(compilation_unit
(struct_declaration
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(attribute_list (attribute (identifier)))
(identifier)
(declaration_list)))
=======================================
Attributes on fields
=======================================
class Zzz {
[A,B()][C]
public int Z;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(attribute_list
(attribute (identifier))
(attribute (identifier) (attribute_argument_list)))
(attribute_list
(attribute (identifier)))
(modifier)
(variable_declaration (predefined_type) (variable_declarator (identifier)))))))
=======================================
Attributes on methods
=======================================
class Methods {
[ValidatedContract]
int Method1() { return 0; }
[method: ValidatedContract]
int Method2() { return 0; }
[return: ValidatedContract]
int Method3() { return 0; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(attribute_list
(attribute (identifier)))
(predefined_type)
(identifier)
(parameter_list)
(block (return_statement (integer_literal))))
(method_declaration
(attribute_list
(attribute_target_specifier)
(attribute (identifier)))
(predefined_type)
(identifier)
(parameter_list)
(block (return_statement (integer_literal))))
(method_declaration
(attribute_list
(attribute_target_specifier)
(attribute (identifier)))
(predefined_type)
(identifier)
(parameter_list)
(block (return_statement (integer_literal)))))))
=======================================
Attributes on enums
=======================================
[Single]
enum A { B, C }
[One][Two]
[Three]
enum A { B, C }
[One]
[Two,Three()]
enum A { B, C }
---
(compilation_unit
(enum_declaration
(attribute_list (attribute (identifier)))
(identifier)
(enum_member_declaration_list
(enum_member_declaration (identifier))
(enum_member_declaration (identifier))))
(enum_declaration
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)))
(identifier)
(enum_member_declaration_list
(enum_member_declaration (identifier))
(enum_member_declaration (identifier))))
(enum_declaration
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(identifier)
(enum_member_declaration_list
(enum_member_declaration (identifier))
(enum_member_declaration (identifier)))))
=======================================
Attributes on events
=======================================
class Zzz {
[A,B()][C]
public event EventHandler SomeEvent { add { } remove { } }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(event_declaration
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(attribute_list (attribute (identifier)))
(modifier)
(identifier)
(identifier)
(accessor_list
(accessor_declaration (block))
(accessor_declaration (block)))))))
=======================================
Attributes on type parameters
=======================================
class Class<[A, B][C()]T1> {
void Method<[E] [F, G(1)] T2>() {
}
}
---
(compilation_unit
(class_declaration (identifier)
(type_parameter_list
(type_parameter
(attribute_list (attribute (identifier)) (attribute (identifier)))
(attribute_list (attribute (identifier) (attribute_argument_list)))
(identifier)))
(declaration_list
(method_declaration (void_keyword) (identifier)
(type_parameter_list
(type_parameter
(attribute_list (attribute (identifier)))
(attribute_list (attribute (identifier))
(attribute (identifier)
(attribute_argument_list (attribute_argument (integer_literal)))))
(identifier)))
(parameter_list)
(block)))))
=======================================
Attributes on event accessors
=======================================
class Zzz {
public event EventHandler SomeEvent {
[A,B()][C] add { }
[A,B()][C] remove { }
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(event_declaration
(modifier)
(identifier)
(identifier)
(accessor_list
(accessor_declaration
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(attribute_list (attribute (identifier)))
(block))
(accessor_declaration
(attribute_list (attribute (identifier)) (attribute (identifier) (attribute_argument_list)))
(attribute_list (attribute (identifier)))
(block)))))))
=======================================
Attributes with trailing comma
=======================================
[Theory,]
void A() { }
---
(compilation_unit
(global_statement
(local_function_statement
(attribute_list (attribute (identifier)))
(void_keyword)
(identifier)
(parameter_list)
(block))))

@ -0,0 +1,562 @@
=====================================
Global empty class
=====================================
public class F {}
---
(compilation_unit
(class_declaration
(modifier)
name: (identifier)
body: (declaration_list)))
=====================================
Class base is dynamic
=====================================
public class F : dynamic { }
---
(compilation_unit
(class_declaration
(modifier)
name: (identifier)
bases: (base_list (identifier))
body: (declaration_list)))
=====================================
Class base is object with interfaces
=====================================
public class F : object, IAlpha, IOmega { }
---
(compilation_unit
(class_declaration
(modifier)
name: (identifier)
bases: (base_list
(predefined_type)
(identifier)
(identifier))
body: (declaration_list)))
=====================================
Partial class
=====================================
public partial class F {}
---
(compilation_unit
(class_declaration
(modifier) (modifier)
(identifier)
(declaration_list)))
=====================================
Class with a single type parameter
=====================================
class F<T> {}
---
(compilation_unit
(class_declaration
(identifier)
(type_parameter_list (type_parameter (identifier)))
(declaration_list)))
=====================================
Class with multiple type parameters
=====================================
internal class F<T1, T2> {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(declaration_list)))
=====================================
Class with co-variant and contra-variant type parameters
=====================================
internal class F<in T1, out T2> {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(declaration_list)))
=====================================
Class with a type parameter struct constraint
=====================================
public class F<T> where T:struct {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Class with a type parameter unmanaged constraint
=====================================
public class F<T> where T:unmanaged {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Class with a type parameter class constraint
=====================================
public class F<T> where T:class {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Class with a type parameter and nullable constraints
=====================================
public class F<T> where T:class?, notnull, Mine? {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause (identifier)
(type_parameter_constraint)
(type_parameter_constraint)
(type_parameter_constraint (type_constraint (nullable_type (identifier)))))
(declaration_list)))
=====================================
Class with type parameter new constraint
=====================================
public class F<T> where T: new() {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(declaration_list)))
=====================================
Class with type parameter identifier constraint
=====================================
public class F<T> where T: I {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(declaration_list)))
=====================================
Class with type parameter identifier and new constraints
=====================================
public class F<T> where T: I, new() {}
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint
(type_constraint (identifier)))
(type_parameter_constraint (constructor_constraint)))
(declaration_list)))
=====================================
Class with multiple type parameter constraints
=====================================
private class F<T1,T2> where T1 : I1, I2, new() where T2 : I2 { }
---
(compilation_unit
(class_declaration
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (constructor_constraint)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(declaration_list)))
=====================================
Class with public constructor
=====================================
class Foo {
public Foo() {}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(constructor_declaration
(modifier)
(identifier)
(parameter_list)
(block)))))
=====================================
Class with expression bodied constructor
=====================================
class Foo {
public Foo(string name) => Name = name;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(constructor_declaration
(modifier)
(identifier)
(parameter_list (parameter (predefined_type) (identifier)))
(arrow_expression_clause
(assignment_expression (identifier) (assignment_operator) (identifier)))))))
=====================================
Class with static constructor
=====================================
class Foo {
static Foo() {}
static extern Foo() {}
extern static Foo() {}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(constructor_declaration
(modifier)
(identifier)
(parameter_list)
(block))
(constructor_declaration
(modifier) (modifier)
(identifier)
(parameter_list)
(block))
(constructor_declaration
(modifier) (modifier)
(identifier)
(parameter_list)
(block)))))
=====================================
Class with extern destructor
=====================================
class Foo {
extern ~Foo() {}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(destructor_declaration
(identifier)
(parameter_list)
(block)))))
=====================================
Class with expression bodied destructor
=====================================
class Foo {
~Foo() => DoSomething();
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(destructor_declaration
(identifier)
(parameter_list)
(arrow_expression_clause
(invocation_expression
(identifier)
(argument_list)))))))
=====================================
Class with constants
=====================================
class Foo {
private const int a = 1;
const string b = $"hello";
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(modifier) (modifier)
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal)))))
(field_declaration
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)))))))))
=====================================
Class with indexer
=====================================
class Foo {
public bool this[int index] {
get { return a; }
set { a = value; }
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(indexer_declaration
(modifier)
(predefined_type)
(bracketed_parameter_list (parameter (predefined_type) (identifier)))
(accessor_list
(accessor_declaration
(block (return_statement (identifier))))
(accessor_declaration
(block (expression_statement (assignment_expression (identifier) (assignment_operator) (identifier))))))))))
=====================================
Class with expression bodied indexer
=====================================
class Foo {
public bool this[int index] => a[index];
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(indexer_declaration
(modifier)
(predefined_type)
(bracketed_parameter_list (parameter (predefined_type) (identifier)))
(arrow_expression_clause
(element_access_expression (identifier)
(bracketed_argument_list (argument (identifier)))))))))
=====================================
Class with expression bodied indexer accessors
=====================================
class Foo {
public string this[int index]
{
get => a[index];
set => a[index] = value;
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(indexer_declaration
(modifier)
(predefined_type)
(bracketed_parameter_list (parameter (predefined_type) (identifier)))
(accessor_list
(accessor_declaration
(arrow_expression_clause
(element_access_expression (identifier)
(bracketed_argument_list (argument (identifier))))))
(accessor_declaration
(arrow_expression_clause
(assignment_expression
(element_access_expression (identifier)
(bracketed_argument_list (argument (identifier))))
(assignment_operator) (identifier)))))))))
=====================================
Class with varargs indexer
=====================================
class A {
public int this[params string[] arguments] {
get { return 1; }
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(indexer_declaration
(modifier)
(predefined_type)
(bracketed_parameter_list
(array_type (predefined_type) (array_rank_specifier)) (identifier))
(accessor_list
(accessor_declaration
(block
(return_statement (integer_literal)))))))))
=================================
Method with qualified return type
=================================
class A {
B.C d() {
return null;
}
}
---
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (qualified_name (identifier) (identifier))
name: (identifier)
parameters: (parameter_list)
body: (block
(return_statement (null_literal)))))))
=================================
Class and methods with Unicode identifiers
=================================
class Ωµ {
B.C d() {
return null;
}
}
---
(compilation_unit
(class_declaration
name: (identifier)
body: (declaration_list
(method_declaration
type: (qualified_name (identifier) (identifier))
name: (identifier)
parameters: (parameter_list)
body: (block
(return_statement (null_literal)))))))

@ -0,0 +1,19 @@
=======================================
From keyword can be a variable
=======================================
var a = Assert.Range(from, to);
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(invocation_expression
(member_access_expression (identifier) (identifier))
(argument_list (argument (identifier)) (argument (identifier))))))))))

@ -0,0 +1,58 @@
=======================================
global enum with one option
=======================================
enum A { One }
---
(compilation_unit
(enum_declaration
name: (identifier)
body: (enum_member_declaration_list
(enum_member_declaration
name: (identifier)))))
=======================================
enum with integer values
=======================================
enum B { Ten = 10, Twenty = 20 }
---
(compilation_unit
(enum_declaration
name: (identifier)
body: (enum_member_declaration_list
(enum_member_declaration
name: (identifier)
value: (integer_literal))
(enum_member_declaration
name: (identifier)
value: (integer_literal)))))
=======================================
enum with byte base
=======================================
namespace A {
enum B : byte { Five = 0x05, Fifteen = 0x0F }
}
---
(compilation_unit
(namespace_declaration
name: (identifier)
body: (declaration_list
(enum_declaration
name: (identifier)
bases: (base_list (predefined_type))
body: (enum_member_declaration_list
(enum_member_declaration
name: (identifier)
value: (integer_literal))
(enum_member_declaration
name: (identifier)
value: (integer_literal)))))))

File diff suppressed because it is too large Load Diff

@ -0,0 +1,122 @@
=======================================
basic indentifiers
=======================================
int x = y;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (identifier)))))))
=======================================
indentifiers with keyword names
=======================================
int @var = @const;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (identifier)))))))
=======================================
identifiers with contextual keyword names
=======================================
int nint = 0;
int nuint = 0;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal)))))))
=======================================
unicode identifiers
=======================================
var under_score = 0;
var with1number = 0;
var varæble = 0;
var Переменная = 0;
var first‿letter = 0;
var ග්‍රහලෝකය = 0;
var _كوكبxxx = 0;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal))))))
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(integer_literal)))))))

@ -0,0 +1,262 @@
=====================================
Global empty interface
=====================================
public interface IOne {};
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(declaration_list)))
=====================================
Interface with properties
=====================================
interface IOne {
byte Get { get; }
char Set { set; }
uint GetSet { get; set; }
long SetGet { set; get; }
};
---
(compilation_unit
(interface_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration))))))
=====================================
Interface with methods
=====================================
interface IOne {
void Nothing();
int Output();
void Input(string a);
int InputOutput(string a);
};
---
(compilation_unit
(interface_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list))
(method_declaration
(predefined_type)
(identifier)
(parameter_list))
(method_declaration
(void_keyword)
(identifier)
(parameter_list (parameter (predefined_type) (identifier))))
(method_declaration
(predefined_type)
(identifier)
(parameter_list (parameter (predefined_type) (identifier)))))))
=====================================
Interface base single
=====================================
private interface IOne : ITwo { }
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(base_list
(identifier))
(declaration_list)))
=====================================
Interface base multiple
=====================================
private interface IOne : ITwo, IThree { }
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(base_list
(identifier)
(identifier))
(declaration_list)))
=====================================
Interface generic
=====================================
private interface IOne<T1> : ITwo { }
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(base_list
(identifier))
(declaration_list)))
=====================================
Interface generic single constraint
=====================================
private interface IOne<T1> : ITwo where T1:T2 { }
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(base_list (identifier))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(declaration_list)))
=====================================
Interface generic multiple constraints
=====================================
private interface IOne<T1, T3> : ITwo where T1:T2 where T3:new() { }
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(base_list (identifier))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(declaration_list)))
=====================================
Interface in namespace
=====================================
namespace A {
interface IOne : ITwo { }
}
---
(compilation_unit
(namespace_declaration
(identifier)
(declaration_list
(interface_declaration
(identifier)
(base_list
(identifier))
(declaration_list)))))
=======================================
Interface event declarations
=======================================
interface A {
event EventHandler<T> SomeEvent;
}
---
(compilation_unit
(interface_declaration
(identifier)
(declaration_list
(event_field_declaration
(variable_declaration
(generic_name (identifier)
(type_argument_list (identifier)))
(variable_declarator (identifier)))))))
=====================================
Interface with indexer
=====================================
interface A {
bool this[int index] { get; set; }
}
---
(compilation_unit
(interface_declaration
(identifier)
(declaration_list
(indexer_declaration
(predefined_type)
(bracketed_parameter_list (parameter (predefined_type) (identifier)))
(accessor_list
(accessor_declaration)
(accessor_declaration))))))
=====================================
Interface with default method
=====================================
interface MyDefault {
void Log(string message) {
Console.WriteLine(message);
}
}
---
(compilation_unit
(interface_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (predefined_type) (identifier)))
(block
(expression_statement
(invocation_expression
(member_access_expression (identifier) (identifier))
(argument_list (argument (identifier))))))))))

@ -0,0 +1,702 @@
=======================================
integer literals
=======================================
const int dec = 1_2;
const long hex = 0xf_1l;
const long hex2 = 0Xffff;
const long hex3 = 0x_0_f;
const UInt64 dec = 1uL;
const UInt16 bin = 0b0100_100;
const UInt16 bin2 = 0B01010__10;
const long bin3 = 0b_0_10;
---
(compilation_unit
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (integer_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (integer_literal)))))))
=======================================
boolean literals
=======================================
const bool t = true, u = false;
---
(compilation_unit
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (boolean_literal)))
(variable_declarator (identifier) (equals_value_clause (boolean_literal)))))))
=======================================
char literals
=======================================
const char c = 'a';
const char esc = '\n';
const char hex = '\xf09a';
const char uni16 = '\ua0bf';
const char uni32 = '\UA0BFf9ca';
---
(compilation_unit
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (character_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (character_literal (escape_sequence)))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (character_literal (escape_sequence)))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (character_literal (escape_sequence)))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (character_literal (escape_sequence))))))))
=======================================
real literals
=======================================
const float s = 012.23F;
const float e = 1e6f;
const Single en = 0e-1f;
const Single ep = 1_1e+12f;
const double d = 0.9_9d;
const double e = .4_9d;
const decimal m = 0_1_2.9m;
const Decimal m2 = 102.349M;
---
(compilation_unit
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (real_literal))))))
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (real_literal)))))))
=======================================
null literals
=======================================
const string x = null;
---
(compilation_unit
(global_statement
(local_declaration_statement
(modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (null_literal)))))))
=======================================
string literals
=======================================
class A {
String e = "";
string s = "a";
string m = "abc";
string esc = "ab\"\t";
string hex = "ab\x22r";
string hex2 = "\x22r\x00";
string u16 = "\ub0d0ok";
string u32 = "\uF1D20ff0test";
string ve = @"";
string v = @"abcde\ef";
string quotes = @"<TestClass xmlns=""http://example.com/omg"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""></TestClass>";
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(identifier)
(variable_declarator (identifier) (equals_value_clause (string_literal)))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal)))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal)))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal (escape_sequence) (escape_sequence))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal (escape_sequence))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal (escape_sequence) (escape_sequence))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal (escape_sequence))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal (escape_sequence))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (verbatim_string_literal)))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (verbatim_string_literal)))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (verbatim_string_literal))))))))
=======================================
string literals
=======================================
var e = @"This
is
a
multi-line";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(verbatim_string_literal)))))))
==================================================
string literals containing the line comment token
==================================================
class A {
string s = "//\n//";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause (string_literal (escape_sequence)))))))))
==================================================
string literals containing block comment
==================================================
string s = "\u0065/* \u0065 */\u0065";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(string_literal
(escape_sequence)
(escape_sequence)
(escape_sequence))))))))
==================================================
verbatim string literals containing block comment
==================================================
string s = @"/* comment */";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(verbatim_string_literal)))))))
==================================================
interpolated string literals
==================================================
class A {
string s = $"hello";
string esc = $"ab\"\t";
string double = $"{{nope}}";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)
(interpolated_string_text
(escape_sequence))
(interpolated_string_text
(escape_sequence)))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)
(interpolated_string_text)))))))))
==================================================
interpolated string literals with expressions
==================================================
class A {
string s = $"hello {name}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)
(interpolation (identifier))
(interpolated_string_text)))))))))
==================================================
interpolated string literals with formatted expressions
==================================================
class A {
string s = $"hello {name:0.00}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)
(interpolation (identifier) (interpolation_format_clause))
(interpolated_string_text)))))))))
==================================================
interpolated string literals with alignment expressions
==================================================
class A {
string s = $"hello {name,25}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text)
(interpolation (identifier)
(interpolation_alignment_clause (integer_literal)))
(interpolated_string_text)))))))))
==================================================
interpolated string literals containing block comment
==================================================
string s = $"\u0065/* \u0065 */\u0065";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_string_text
(escape_sequence))
(interpolated_string_text)
(interpolated_string_text
(escape_sequence))
(interpolated_string_text)
(interpolated_string_text
(escape_sequence)))))))))
==================================================
interpolated verbatim string literals
==================================================
class A {
string s = $@"hello";
string s = @$"hello";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text))))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)))))))))
==================================================
interpolated verbatim string literals with expressions
==================================================
class A {
string s = $@"hello {name}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)
(interpolation (identifier))
(interpolated_verbatim_string_text)))))))))
==================================================
interpolated verbatim string literals with formatted expressions
==================================================
class A {
string s = $@"hello {name:g}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)
(interpolation (identifier) (interpolation_format_clause))
(interpolated_verbatim_string_text)))))))))
==================================================
interpolated verbatim string literals with alignment expressions
==================================================
class A {
string s = $@"hello {name,-10}, how are you?";
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)
(interpolation (identifier)
(interpolation_alignment_clause (prefix_unary_expression (integer_literal))))
(interpolated_verbatim_string_text)))))))))
==================================================
interpolated verbatim string literals bracket escapes (WRONG!)
==================================================
var s = $@"Another
multiple
line";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression (interpolated_verbatim_string_text))))))))
==================================================
interpolated verbatim string literals bracket escapes
==================================================
string s = $@"
class A
{{
bool Method(int value)
{{
return value is {operatorText} 3 or {operatorText} 5;
}}
}}
";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)
(interpolated_verbatim_string_text)
(interpolated_verbatim_string_text)
(interpolated_verbatim_string_text)
(interpolated_verbatim_string_text)
(interpolation (identifier))
(interpolated_verbatim_string_text)
(interpolation (identifier))
(interpolated_verbatim_string_text))))))))
==================================================
interpolated verbatim string containing block comment
==================================================
string s = $@"{a}/* comment */{a}";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolation
(identifier))
(interpolated_verbatim_string_text)
(interpolation
(identifier)))))))))
==================================================
interpolated verbatim string comment with interpolation
==================================================
var x = $@"/* {world} */";
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(interpolated_string_expression
(interpolated_verbatim_string_text)
(interpolation
(identifier))
(interpolated_verbatim_string_text))))))))

@ -0,0 +1,202 @@
===================================
If, elif and else directives
===================================
#if WIN32
string os = "Win32";
#elif MACOS
string os = "MacOS";
#else
string os = "Unknown";
#endif
---
(compilation_unit
(if_directive (identifier))
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal))))))
(elif_directive (identifier))
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal))))))
(else_directive)
(global_statement
(local_declaration_statement
(variable_declaration
(predefined_type)
(variable_declarator (identifier) (equals_value_clause (string_literal))))))
(endif_directive))
===========================
Complex if conditions
===========================
#if !MACOS
#if WIN32==true
#if !MACOS!=false
#if A && B || C
#if (A)
#if (A || B)
#if (A && B) || C
---
(compilation_unit
(if_directive (prefix_unary_expression (identifier)))
(if_directive
(binary_expression (identifier) (boolean_literal)))
(if_directive
(binary_expression (prefix_unary_expression (identifier)) (boolean_literal)))
(if_directive
(binary_expression (binary_expression (identifier) (identifier)) (identifier)))
(if_directive (parenthesized_expression (identifier)))
(if_directive
(parenthesized_expression (binary_expression (identifier) (identifier))))
(if_directive
(binary_expression
(parenthesized_expression (binary_expression (identifier) (identifier)))
(identifier))))
===========================
Region directives
===========================
#region Here, there, everywhere
// something fast
#endregion
---
(compilation_unit
(region_directive (preproc_message))
(comment)
(endregion_directive))
===================================
Define and undefine directives
===================================
#define SOMETHING
#undef BAD
---
(compilation_unit
(define_directive (identifier))
(undef_directive (identifier)))
===================================
Warning and error directives
===================================
class Of1879 {
#warning This class is bad.
#error Okay, just stop.
}
---
(compilation_unit
(class_declaration (identifier) (declaration_list
(warning_directive (preproc_message))
(error_directive (preproc_message)))))
===================================
Line directives
===================================
class Of1879 {
void AMethod() {
#line 2001 "A Space" // Comment
#line hidden
#line default
}
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list)
(block
(line_directive (preproc_integer_literal) (preproc_string_literal)) (comment)
(line_directive)
(line_directive))))))
===================================
Spaces in directives
===================================
class Of1879 {
void AMethod() {
# line 2001 "A Space"
# line hidden
# line default
}
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list)
(block
(line_directive (preproc_integer_literal) (preproc_string_literal))
(line_directive)
(line_directive))))))
===================================
Pragmas
===================================
#pragma warning disable 660,661,nullable
---
(compilation_unit
(pragma_directive (integer_literal) (integer_literal) (identifier)))
===================================
Directives not in strings or comments
===================================
class Of1879 {
void AMethod() {
var s = @"Only a string
#if NOPE
";
/* Only a comment
#if NOPE
*/
}
}
---
(compilation_unit (class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list)
(block
(local_declaration_statement
(variable_declaration (implicit_type)
(variable_declarator (identifier)
(equals_value_clause (verbatim_string_literal)))))
(comment))))))

@ -0,0 +1,429 @@
=====================================
Query from select
=====================================
var x = from a in source select a.B;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(member_access_expression
(identifier)
(identifier))))))))))
=====================================
Query from select with operator
=====================================
var x = from a in source select a * 2;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(binary_expression
(identifier)
(integer_literal))))))))))
=====================================
Query from select with method call
=====================================
var x = from a in source select a.B();
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(invocation_expression
(member_access_expression
(identifier)
(identifier))
(argument_list))))))))))
=====================================
Query from select with conditional operator
=====================================
var x = from a in source select a ? 0 : 1;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(conditional_expression
(identifier)
(integer_literal)
(integer_literal))))))))))
=====================================
Query from select with assignment
=====================================
var x = from a in source select somevar = a;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(assignment_expression
(identifier)
(assignment_operator)
(identifier))))))))))
=====================================
Query from select projection
=====================================
var x = from a in source select new { Name = a.B };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(select_clause
(anonymous_object_creation_expression
(name_equals (identifier))
(member_access_expression
(identifier)
(identifier)))))))))))
=====================================
Query from select with where
=====================================
var x = from a in source
where a.B == "A"
select a;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(where_clause
(binary_expression
(member_access_expression
(identifier)
(identifier))
(string_literal)))
(select_clause
(identifier)))))))))
=====================================
Query from select with where and projection
=====================================
var x = from a in source
where a.B == "A" && a.C == "D"
select new { Name = a.B };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(where_clause
(binary_expression
(binary_expression
(member_access_expression
(identifier)
(identifier))
(string_literal))
(binary_expression
(member_access_expression
(identifier)
(identifier))
(string_literal))))
(select_clause
(anonymous_object_creation_expression
(name_equals (identifier))
(member_access_expression
(identifier)
(identifier)))))))))))
=====================================
Query from select with orderby
=====================================
var x = from a in source
orderby a.A descending
orderby a.C ascending
orderby 1
select a;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(order_by_clause
(member_access_expression
(identifier)
(identifier)))
(order_by_clause
(member_access_expression
(identifier)
(identifier)))
(order_by_clause
(integer_literal))
(select_clause
(identifier)))))))))
=====================================
Query from select with let
=====================================
var x = from a in source
let z = new { a.A, a.B }
select z;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(let_clause
(identifier)
(anonymous_object_creation_expression
(member_access_expression
(identifier)
(identifier))
(member_access_expression
(identifier)
(identifier))))
(select_clause
(identifier)))))))))
=====================================
Query from select with join
=====================================
var x = from a in sourceA
join b in sourceB on a.FK equals b.PK
select new { A.A, B.B };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(join_clause
(identifier)
(identifier)
(member_access_expression
(identifier)
(identifier))
(member_access_expression
(identifier)
(identifier)))
(select_clause
(anonymous_object_creation_expression
(member_access_expression
(identifier)
(identifier))
(member_access_expression
(identifier)
(identifier)))))))))))
=====================================
Query from select with multiple from
=====================================
var x = from a in sourceA
from b in sourceB
where a.FK == b.FK
select new { A.A, B.B };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(from_clause
(identifier)
(identifier))
(where_clause
(binary_expression
(member_access_expression
(identifier)
(identifier))
(member_access_expression
(identifier)
(identifier))))
(select_clause
(anonymous_object_creation_expression
(member_access_expression
(identifier)
(identifier))
(member_access_expression
(identifier)
(identifier)))))))))))
=====================================
Query from select with group by & continuation
=====================================
var x = from a in sourceA
group a by a.Country into g
select new { Country = g.Key, Population = g.Sum(p => p.Population) };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(query_expression
(from_clause
(identifier)
(identifier))
(group_clause
(identifier)
(member_access_expression
(identifier)
(identifier)))
(query_continuation
(identifier)
(select_clause
(anonymous_object_creation_expression
(name_equals (identifier))
(member_access_expression
(identifier)
(identifier))
(name_equals (identifier))
(invocation_expression
(member_access_expression
(identifier)
(identifier))
(argument_list
(argument
(lambda_expression
(identifier)
(member_access_expression
(identifier)
(identifier))))))))))))))))

@ -0,0 +1,392 @@
=====================================
Basic record declaration
=====================================
record F {
int Age { get; init; }
}
---
(compilation_unit
(record_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration))))))
=====================================
Basic record struct declaration
=====================================
record struct F {
int Age { get; init; }
}
---
(compilation_unit
(record_struct_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration))))))
=====================================
Record with a type parameter struct constraint
=====================================
public record F<T> where T:struct {}
---
(compilation_unit
(record_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Record with a type parameter class constraint
=====================================
public record F<T> where T:class {}
---
(compilation_unit
(record_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Record with type parameter new constraint
=====================================
public record F<T> where T: new() {}
---
(compilation_unit
(record_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(declaration_list)))
=====================================
Record with interface
=====================================
public record A : ISomething { }
---
(compilation_unit
(record_declaration
(modifier)
(identifier)
(base_list (identifier))
(declaration_list)))
=====================================
Record with multiple type parameter constraints
=====================================
[Nice]
private record F<T1,T2> where T1 : I1, I2, new() where T2 : I2 { }
---
(compilation_unit
(record_declaration
(attribute_list
(attribute (identifier)))
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (constructor_constraint)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(declaration_list)))
=====================================
Record with constructor
=====================================
record Person(string FirstName, string LastName);
---
(compilation_unit
(record_declaration
(identifier)
(parameter_list
(parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier)))))
=====================================
Record inheritance with constructor overload
=====================================
record Teacher(string FirstName, string LastName, string Subject) : Person(FirstName, LastName);
---
(compilation_unit
(record_declaration
(identifier)
(parameter_list (parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier)))
(base_list
(primary_constructor_base_type
(identifier)
(argument_list
(argument (identifier))
(argument (identifier)))))))
=====================================
Record inheritance with constructor overload and interfaces
=====================================
record Teacher(string FirstName, string LastName, string Subject) : Person(FirstName, LastName), I1, I2;
---
(compilation_unit
(record_declaration
(identifier)
(parameter_list (parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier)))
(base_list
(primary_constructor_base_type
(identifier)
(argument_list
(argument (identifier))
(argument (identifier))))
(identifier)
(identifier))))
=====================================
Record types can seal ToString()
=====================================
record A{
public sealed override string ToString(){
return "";
}
}
---
(compilation_unit
(record_declaration
(identifier)
(declaration_list
(method_declaration
(modifier)
(modifier)
(modifier)
(predefined_type)
(identifier)
(parameter_list)
(block
(return_statement (string_literal)))))))
=====================================
With expression typical basic form
=====================================
void A() {
var newFriend = friend with { LastName = "Edwards" };
}
---
(compilation_unit
(global_statement
(local_function_statement (void_keyword) (identifier) (parameter_list)
(block
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(with_expression
(identifier)
(with_initializer_expression
(simple_assignment_expression
(identifier)
(string_literal))))))))))))
=====================================
With expression using expressions
=====================================
void A() {
var friend = GetAFriend() with {
ForeName = RandomFirstName(),
LastName = RandomLastName()
};
}
---
(compilation_unit
(global_statement
(local_function_statement (void_keyword) (identifier) (parameter_list)
(block
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(with_expression
(invocation_expression (identifier) (argument_list))
(with_initializer_expression
(simple_assignment_expression
(identifier)
(invocation_expression (identifier) (argument_list)))
(simple_assignment_expression
(identifier)
(invocation_expression (identifier) (argument_list)))))))))))))
=====================================
Precedence between with and cast
=====================================
var x = (Point) p1 with {X = 3};
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(with_expression
(cast_expression
(identifier)
(identifier))
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))))))))
=====================================
Precedence between with and switch
=====================================
var x = p1 with {X = 3} switch { _ => 3 };
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(switch_expression
(with_expression
(identifier)
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))
(switch_expression_arm
(discard)
(integer_literal)))))))))
=====================================
Precedence between with and equals
=====================================
var x = p1 with {X = 3} == p1 with {X = 4};
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(binary_expression
(with_expression
(identifier)
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))
(with_expression
(identifier)
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal)))))))))))
=====================================
Associativity of with expression
=====================================
var x = p1 with {X = 3} with {X = 4} with {X = 5};
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration
(implicit_type)
(variable_declarator
(identifier)
(equals_value_clause
(with_expression
(with_expression
(with_expression
(identifier)
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))
(with_initializer_expression
(simple_assignment_expression
(identifier)
(integer_literal))))))))))

@ -0,0 +1,207 @@
=====================================
Using directives
=====================================
using A;
using B.C;
using global::E.F;
using G = H.I;
using static J.K;
---
(compilation_unit
(using_directive
(identifier))
(using_directive
(qualified_name (identifier) (identifier)))
(using_directive
(qualified_name
(alias_qualified_name (identifier) (identifier))
(identifier)))
(using_directive
(name_equals (identifier))
(qualified_name (identifier) (identifier)))
(using_directive
(qualified_name (identifier) (identifier))))
=====================================
Nested using directives
=====================================
namespace Foo {
using A;
}
---
(compilation_unit
(namespace_declaration
(identifier)
(declaration_list
(using_directive
(identifier)))))
=====================================
Global using directives
=====================================
global using A;
global using static A.B;
---
(compilation_unit
(using_directive
(identifier))
(using_directive
(qualified_name
(identifier)
(identifier))))
=====================================
Comments
=====================================
// I'm a single-line comment
/*
* I'm a block comment: a * b / c
*/
---
(compilation_unit (comment) (comment))
=====================================
Comment with double asterisk
=====================================
/** test **/
---
(compilation_unit (comment))
=====================================
Namespaces
=====================================
namespace A {
namespace B.C.D {
}
namespace E.F {
}
}
---
(compilation_unit
(namespace_declaration
(identifier)
(declaration_list
(namespace_declaration
(qualified_name
(qualified_name (identifier) (identifier))
(identifier))
(declaration_list))
(namespace_declaration
(qualified_name (identifier) (identifier))
(declaration_list)))))
=====================================
File scoped namespaces
=====================================
namespace A;
class B {
}
---
(compilation_unit
(file_scoped_namespace_declaration
(identifier)
(class_declaration
(identifier)
(declaration_list))))
=====================================
Interfaces
=====================================
public interface IFoo {
}
---
(compilation_unit
(interface_declaration
(modifier)
(identifier)
(declaration_list)))
=====================================
Externs
=====================================
extern alias A;
---
(compilation_unit
(extern_alias_directive
(identifier)))
=====================================
Delegates
=====================================
public delegate int Global(ref char a = '\n');
delegate void A<T>() where T:class;
delegate void A(params int [] test);
class Z {
delegate void Zed();
}
---
(compilation_unit
(delegate_declaration
(modifier)
(predefined_type)
(identifier)
(parameter_list
(parameter
(parameter_modifier)
(predefined_type)
(identifier)
(equals_value_clause (character_literal (escape_sequence))))))
(delegate_declaration (void_keyword) (identifier)
(type_parameter_list (type_parameter (identifier)))
(parameter_list)
(type_parameter_constraints_clause (identifier) (type_parameter_constraint)))
(delegate_declaration (void_keyword) (identifier)
(parameter_list (array_type (predefined_type) (array_rank_specifier)) (identifier)))
(class_declaration (identifier) (declaration_list
(delegate_declaration (void_keyword) (identifier) (parameter_list)))))
=====================================
Var declared equal to integer literal
=====================================
var a = 1;
---
(compilation_unit
(global_statement
(local_declaration_statement
(variable_declaration (implicit_type)
(variable_declarator (identifier)
(equals_value_clause (integer_literal)))))))

File diff suppressed because it is too large Load Diff

@ -0,0 +1,121 @@
=====================================
Struct with a type parameter struct constraint
=====================================
public struct F<T> where T:struct {}
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Struct with a type parameter class constraint
=====================================
public struct F<T> where T:class {}
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier) (type_parameter_constraint))
(declaration_list)))
=====================================
Struct with type parameter new constraint
=====================================
public struct F<T> where T: new() {}
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(declaration_list)))
=====================================
Struct with interface
=====================================
public struct A : ISomething { }
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(base_list (identifier))
(declaration_list)))
=====================================
Struct with multiple type parameter constraints
=====================================
private struct F<T1,T2> where T1 : I1, I2, new() where T2 : I2 { }
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (constructor_constraint)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier))))
(declaration_list)))
=====================================
Struct with readonly modifier
=====================================
readonly struct Test {
}
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(declaration_list)))
=====================================
Struct with ref modifier
=====================================
ref struct Test {
}
---
(compilation_unit
(struct_declaration
(modifier)
(identifier)
(declaration_list)))

@ -0,0 +1,67 @@
=======================================
Class event declarations
=======================================
class A {
public event EventHandler<T> SomeEvent { add { } remove { } }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(event_declaration
(modifier)
(generic_name (identifier)
(type_argument_list (identifier)))
(identifier)
(accessor_list
(accessor_declaration (block))
(accessor_declaration (block)))))))
=======================================
Struct event declarations
=======================================
struct A {
public event EventHandler<T> SomeEvent { add { } remove { } }
}
---
(compilation_unit
(struct_declaration
(identifier)
(declaration_list
(event_declaration
(modifier)
(generic_name (identifier)
(type_argument_list (identifier)))
(identifier)
(accessor_list
(accessor_declaration (block))
(accessor_declaration (block)))))))
=======================================
Class event declarations with expression bodies
=======================================
class A {
public event EventHandler SomeEvent { add => addSomething(); remove => removeSomething(); }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(event_declaration
(modifier)
(identifier)
(identifier)
(accessor_list
(accessor_declaration (arrow_expression_clause (invocation_expression (identifier) (argument_list))))
(accessor_declaration (arrow_expression_clause (invocation_expression (identifier) (argument_list)))))))))

@ -0,0 +1,266 @@
=======================================
Class field declarations
=======================================
class A {
public readonly int _B;
Int64 D_e_f, g;
Tuple<char, Nullable<int>> z;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(modifier) (modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(identifier)
(variable_declarator (identifier))
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(generic_name (identifier) (type_argument_list
(predefined_type)
(generic_name (identifier) (type_argument_list (predefined_type)))))
(variable_declarator (identifier)))))))
=======================================
Struct field declarations
=======================================
struct A {
private readonly int c_;
}
---
(compilation_unit
(struct_declaration
(identifier)
(declaration_list
(field_declaration
(modifier) (modifier)
(variable_declaration
(predefined_type)
(variable_declarator (identifier)))))))
=======================================
Class field nullable type
=======================================
class A {
public readonly int? i;
private Byte? b;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(modifier) (modifier)
(variable_declaration
(nullable_type (predefined_type))
(variable_declarator (identifier))))
(field_declaration
(modifier)
(variable_declaration
(nullable_type (identifier))
(variable_declarator (identifier)))))))
=======================================
Class field pointer type
=======================================
class A {
public readonly int* i;
private Byte* b;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(modifier) (modifier)
(variable_declaration
(pointer_type (predefined_type))
(variable_declarator (identifier))))
(field_declaration
(modifier)
(variable_declaration
(pointer_type (identifier))
(variable_declarator (identifier)))))))
=======================================
Function pointer type
=======================================
class A {
// Function pointer equivalent without calling convention
delegate*<string, int> a;
delegate*<delegate*<in string, int>, delegate*<string, ref readonly int>> b;
// Function pointer equivalent with calling convention
delegate* managed<string, int> c;
delegate*<delegate* unmanaged[MyCallConv, YourCallConv]<string, int>, delegate*<string, int>> d;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(comment)
(field_declaration
(variable_declaration
(function_pointer_type
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type)))
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(function_pointer_type
(function_pointer_parameter
(function_pointer_type
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type))))
(function_pointer_parameter
(function_pointer_type
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type)))))
(variable_declarator (identifier))))
(comment)
(field_declaration
(variable_declaration
(function_pointer_type
(function_pointer_calling_convention)
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type)))
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(function_pointer_type
(function_pointer_parameter
(function_pointer_type
(function_pointer_calling_convention
(function_pointer_unmanaged_calling_convention_list
(function_pointer_unmanaged_calling_convention (identifier))
(function_pointer_unmanaged_calling_convention (identifier))))
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type))))
(function_pointer_parameter
(function_pointer_type
(function_pointer_parameter (predefined_type))
(function_pointer_parameter (predefined_type)))))
(variable_declarator (identifier)))))))
=======================================
Ref readonly
=======================================
class A {
ref readonly Point Origin => ref origin;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(modifier)
(modifier)
(identifier)
(identifier)
(arrow_expression_clause (ref_expression (identifier)))))))
=======================================
Nullable reference types
=======================================
class A {
string? a;
A? a;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(nullable_type (predefined_type))
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(nullable_type (identifier))
(variable_declarator (identifier)))))))
=======================================
Tuple types
=======================================
class A {
(int, string str) a;
(B b, C c, D d) a;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(tuple_type
(tuple_element (predefined_type))
(tuple_element (predefined_type) (identifier)))
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(tuple_type
(tuple_element (identifier) (identifier))
(tuple_element (identifier) (identifier))
(tuple_element (identifier) (identifier)))
(variable_declarator (identifier)))))))
=======================================
Native interger types
=======================================
class A {
nint a;
nuint b;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier))))
(field_declaration
(variable_declaration
(predefined_type)
(variable_declarator (identifier)))))))

@ -0,0 +1,348 @@
=======================================
Class method with single parameter
=======================================
class A {
private int GetBack(int b) {
return b;
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(modifier)
(predefined_type)
(identifier)
(parameter_list
(parameter (predefined_type) (identifier)))
(block
(return_statement (identifier)))))))
=======================================
Class method with multiple parameters
=======================================
class A {
void DoSomething(A a, B b) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (identifier) (identifier))
(parameter (identifier) (identifier)))
(block)))))
=======================================
Class generic method
=======================================
class A {
void Accept<T>(T accept) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(parameter_list
(parameter (identifier) (identifier)))
(block)))))
=======================================
Class generic method with new type constraint
=======================================
class A {
void Accept<T>(T accept) where T: new() {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(type_parameter_list (type_parameter (identifier)))
(parameter_list
(parameter (identifier) (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(block)))))
=======================================
Class generic method with multiple type constraints
=======================================
class A {
void Accept<T1, T2>(T1 accept, T2 from)
where T1: new()
where T2: T1, new() {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(type_parameter_list
(type_parameter (identifier))
(type_parameter (identifier)))
(parameter_list
(parameter (identifier) (identifier))
(parameter (identifier) (identifier)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (constructor_constraint)))
(type_parameter_constraints_clause
(identifier)
(type_parameter_constraint (type_constraint (identifier)))
(type_parameter_constraint (constructor_constraint)))
(block)))))
=======================================
Class method with out parameter
=======================================
class A {
void HasAnOut(out int a) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (parameter_modifier) (predefined_type) (identifier)))
(block)))))
=======================================
Class method with in parameter
=======================================
class A {
void HasAnOut(in int a) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (parameter_modifier) (predefined_type) (identifier)))
(block)))))
=======================================
Class method with ref parameter
=======================================
class A {
void HasAnOut(ref int a) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (parameter_modifier) (predefined_type) (identifier)))
(block)))))
=======================================
Class method with contextually-reserved keyword named parameters
=======================================
class A {
void HasAnOut(int from, string partial) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter (predefined_type) (identifier))
(parameter (predefined_type) (identifier)))
(block)))))
=======================================
Class method with default parameter
=======================================
class A {
void HasAnOut(int a = 5) {
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(void_keyword)
(identifier)
(parameter_list
(parameter
(predefined_type)
(identifier)
(equals_value_clause (integer_literal))))
(block)))))
=======================================
Class static method with single parameter
=======================================
class A {
static int GetBack(int b) {
return b;
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(modifier)
(predefined_type)
(identifier)
(parameter_list
(parameter (predefined_type) (identifier)))
(block
(return_statement (identifier)))))))
=======================================
Class method with explicit interface specifier
=======================================
class A : ISomething {
int ISomething.GetBack(int b) {
return b;
}
}
---
(compilation_unit
(class_declaration
(identifier)
(base_list (identifier))
(declaration_list
(method_declaration
(predefined_type)
(explicit_interface_specifier (identifier))
(identifier)
(parameter_list
(parameter (predefined_type) (identifier)))
(block
(return_statement (identifier)))))))
=======================================
Class method with readonly method
=======================================
class A {
public readonly double Add => x + y;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(modifier)
(modifier)
(predefined_type)
(identifier)
(arrow_expression_clause
(binary_expression (identifier) (identifier)))))))
=======================================
Class method with nullable parameter list
=======================================
class A {
public int Zero(params int[]? ints) => 0;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(method_declaration
(modifier)
(predefined_type)
(identifier)
(parameter_list
(nullable_type
(array_type
(predefined_type)
(array_rank_specifier)))
(identifier))
(arrow_expression_clause
(integer_literal))))))

@ -0,0 +1,184 @@
=======================================
Operator declarations
=======================================
class A
{
[SomeAttribute]
public static int operator +(A a) { return 0; }
public static int operator +(A a, A b) { return 0; }
int operator -(A a) { return 0; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(operator_declaration
(attribute_list (attribute (identifier)))
(modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(block (return_statement (integer_literal))))
(operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier))
(parameter (identifier) (identifier)))
(block (return_statement (integer_literal))))
(operator_declaration
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(block (return_statement (integer_literal)))))))
=======================================
boolean operator declarations
=======================================
class A
{
public static bool operator true(A a) { return true; }
bool operator false(A a) { return false; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(block (return_statement (boolean_literal))))
(operator_declaration
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(block (return_statement (boolean_literal)))))))
=======================================
conversion operator declaration
=======================================
class A
{
public static implicit operator int (A a) { return 0; }
explicit operator int (A a) { return 0; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(conversion_operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list (parameter (identifier) (identifier)))
(block (return_statement (integer_literal))))
(conversion_operator_declaration
(predefined_type)
(parameter_list (parameter (identifier) (identifier)))
(block (return_statement (integer_literal)))))))
=======================================
conversion operator with expression body
=======================================
class A
{
public static implicit operator int (A a) => 0;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(conversion_operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list (parameter (identifier) (identifier)))
(arrow_expression_clause (integer_literal))))))
=======================================
extern operators
=======================================
class A
{
public static extern int operator + (A a);
public static extern bool operator <(A a, A b);
public static explicit operator int (A a);
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(operator_declaration
(modifier) (modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier))))
(operator_declaration
(modifier) (modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier))
(parameter (identifier) (identifier))))
(conversion_operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list (parameter (identifier) (identifier)))))))
=======================================
Class conversion operators with expression body
=======================================
class A
{
public static extern int operator + (A a) => 0;
public static extern bool operator <(A a, A b) => true;
public static explicit operator int (A a) => 0;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(operator_declaration
(modifier) (modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(arrow_expression_clause (integer_literal)))
(operator_declaration
(modifier) (modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier))
(parameter (identifier) (identifier)))
(arrow_expression_clause (boolean_literal)))
(conversion_operator_declaration
(modifier) (modifier)
(predefined_type)
(parameter_list
(parameter (identifier) (identifier)))
(arrow_expression_clause (integer_literal))))))

@ -0,0 +1,196 @@
=====================================
Class with bodyless properties
=====================================
class Foo {
byte Get { get; }
char Set { set; }
uint GetSet { get; set; }
long SetGet { set; get; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration) (accessor_declaration)))
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration) (accessor_declaration))))))
=====================================
Class with init properties
=====================================
class Person
{
public string FirstName { get; init; }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(modifier)
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration) (accessor_declaration))))))
=====================================
Class with single-accessor property bodies
=====================================
class Foo {
byte Get { get { return 0xFF; } }
char Set { set { x = value; } }
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration
(block
(return_statement (integer_literal))))))
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration
(block
(expression_statement
(assignment_expression
(identifier)
(assignment_operator)
(identifier))))))))))
=====================================
Class with double-accessor property bodies
=====================================
class Foo {
uint GetSet {
get { return x; }
set { x = value; }
}
long SetGet {
set { x = value; }
get { return x; }
}
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration
(block
(return_statement (identifier))))
(accessor_declaration
(block
(expression_statement
(assignment_expression
(identifier)
(assignment_operator)
(identifier)))))))
(property_declaration
(predefined_type)
(identifier)
(accessor_list
(accessor_declaration
(block
(expression_statement
(assignment_expression
(identifier)
(assignment_operator)
(identifier)))))
(accessor_declaration
(block
(return_statement (identifier)))))))))
=====================================
Class with bodyless properties and initializers
=====================================
class Foo {
byte Get { get; } = 0x00;
uint GetSet { get; set; } = 1;
long SetGet { set; get; } = 2;
}
---
(compilation_unit
(class_declaration
(identifier)
(declaration_list
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration))
(integer_literal))
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration))
(integer_literal))
(property_declaration
(predefined_type)
(identifier)
(accessor_list (accessor_declaration) (accessor_declaration))
(integer_literal)))))
=====================================
Class with explicit interface properties
=====================================
class Foo: IFoo {
byte IFoo.Get { get; }
}
---
(compilation_unit
(class_declaration
(identifier)
(base_list (identifier))
(declaration_list
(property_declaration
(predefined_type)
(explicit_interface_specifier (identifier))
(identifier)
(accessor_list (accessor_declaration))))))

File diff suppressed because it is too large Load Diff

@ -0,0 +1,13 @@
try {
module.exports = require("./build/Release/tree_sitter_c_sharp_binding");
} catch (error) {
try {
module.exports = require("./build/Debug/tree_sitter_c_sharp_binding");
} catch (_) {
throw error
}
}
try {
module.exports.nodeTypeInfo = require("./src/node-types.json");
} catch (_) {}

@ -0,0 +1,33 @@
{
"name": "tree-sitter-c-sharp",
"version": "0.19.0",
"description": "C# grammar for tree-sitter",
"main": "bindings/node",
"keywords": [
"parser",
"lexer"
],
"repository": {
"type": "git",
"url": "https://github.com/tree-sitter/tree-sitter-c-sharp.git"
},
"author": "Max Brunsfeld",
"license": "MIT",
"dependencies": {
"nan": "^2.14.0"
},
"devDependencies": {
"tree-sitter-cli": "^0.19.4"
},
"scripts": {
"test": "tree-sitter test && node test.js"
},
"tree-sitter": [
{
"scope": "source.cs",
"file-types": [
"cs"
]
}
]
}

@ -0,0 +1,238 @@
;; Methods
(method_declaration (identifier) @type (identifier) @function)
;; Types
(interface_declaration name: (identifier) @type)
(class_declaration name: (identifier) @type)
(enum_declaration name: (identifier) @type)
(struct_declaration (identifier) @type)
(record_declaration (identifier) @type)
(namespace_declaration name: (identifier) @type)
(constructor_declaration name: (identifier) @type)
[
(implicit_type)
(nullable_type)
(pointer_type)
(function_pointer_type)
(predefined_type)
] @type.builtin
;; Enum
(enum_member_declaration (identifier) @property.definition)
;; Literals
[
(real_literal)
(integer_literal)
] @number
[
(character_literal)
(string_literal)
(verbatim_string_literal)
(interpolated_string_text)
(interpolated_verbatim_string_text)
"\""
"$\""
"@$\""
"$@\""
] @string
[
(boolean_literal)
(null_literal)
(void_keyword)
] @constant.builtin
;; Comments
(comment) @comment
;; Tokens
[
";"
"."
","
] @punctuation.delimiter
[
"--"
"-"
"-="
"&"
"&&"
"+"
"++"
"+="
"<"
"<<"
"="
"=="
"!"
"!="
"=>"
">"
">>"
"|"
"||"
"?"
"??"
"^"
"~"
"*"
"/"
"%"
":"
] @operator
[
"("
")"
"["
"]"
"{"
"}"
] @punctuation.bracket
;; Keywords
(modifier) @keyword
(this_expression) @keyword
(escape_sequence) @keyword
[
"as"
"base"
"break"
"case"
"catch"
"checked"
"class"
"continue"
"default"
"delegate"
"do"
"else"
"enum"
"event"
"explicit"
"finally"
"for"
"foreach"
"goto"
"if"
"implicit"
"interface"
"is"
"lock"
"namespace"
"operator"
"params"
"return"
"sizeof"
"stackalloc"
"struct"
"switch"
"throw"
"try"
"typeof"
"unchecked"
"using"
"while"
"new"
"await"
"in"
"yield"
"get"
"set"
"when"
"out"
"ref"
"from"
"where"
"select"
"record"
"init"
"with"
"let"
] @keyword
;; Linq
(from_clause (identifier) @variable)
(group_clause)
(order_by_clause)
(select_clause (identifier) @variable)
(query_continuation (identifier) @variable) @keyword
;; Record
(with_expression
(with_initializer_expression
(simple_assignment_expression
(identifier) @variable)))
;; 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)
(assignment_expression (identifier) @variable)
(cast_expression (identifier) @type (identifier) @variable)
;; Class
(base_list (identifier) @type)
(property_declaration (generic_name))
(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)
;; Lambda
(lambda_expression) @variable
;; Attribute
(attribute) @type
;; Parameter
(parameter
type: (identifier) @type
name: (identifier) @variable.parameter)
(parameter (identifier) @variable.parameter)
(parameter_modifier) @keyword
;; Typeof
(type_of_expression (identifier) @type)
;; Variable
(variable_declaration (identifier) @type)
(variable_declarator (identifier) @variable)
;; Return
(return_statement (identifier) @variable)
(yield_statement (identifier) @variable)
;; Type
(generic_name (identifier) @type)
(type_parameter (identifier) @property.definition)
(type_argument_list (identifier) @type)
;; Type constraints
(type_parameter_constraints_clause (identifier) @property.definition)
(type_constraint (identifier) @type)
;; Exception
(catch_declaration (identifier) @type (identifier) @variable)
(catch_declaration (identifier) @type)
;; Switch
(switch_statement (identifier) @variable)
(switch_expression (identifier) @variable)
;; Lock statement
(lock_statement (identifier) @variable)

@ -0,0 +1,46 @@
(class_declaration
name: (identifier) @name
) @definition.class
(class_declaration
bases: (base_list (_) @name)
) @reference.class
(interface_declaration
name: (identifier) @name
) @definition.interface
(interface_declaration
bases: (base_list (_) @name)
) @reference.interface
(method_declaration
name: (identifier) @name
) @definition.method
(object_creation_expression
type: (identifier) @name
) @reference.class
(type_parameter_constraints_clause
target: (identifier) @name
) @reference.class
(type_constraint
type: (identifier) @name
) @reference.class
(variable_declaration
type: (identifier) @name
) @reference.class
(invocation_expression
function:
(member_access_expression
name: (identifier) @name
)
) @reference.send
(namespace_declaration
name: (identifier) @name
) @definition.module

@ -0,0 +1,19 @@
#!/bin/bash
set -e
function checkout() {
repo=$1; url=$2; sha=$3
if [ ! -d "$repo" ]; then
git clone "https://github.com/$url" "$repo"
fi
pushd "$repo"
git fetch && git reset --hard "$sha"
popd
}
checkout examples/Newtonsoft.Json JamesNK/Newtonsoft.Json 7c3d7f8da7e35dde8fa74188b0decff70f8f10e3
checkout examples/nunit nunit/nunit ad49f27294bd0f2677d8699756c6ccb10df600f8
checkout examples/orchard OrchardCMS/orchard 0a82721968232b07354edcaac63a9ccea02220c6

@ -0,0 +1,3 @@
examples/Newtonsoft.Json/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs
examples/Newtonsoft.Json/Src/Newtonsoft.Json.Tests/TestFixtureBase.cs
examples/Newtonsoft.Json/Src/Newtonsoft.Json/JsonReader.cs

@ -0,0 +1,18 @@
#!/bin/bash
set -eu
known_failures="$(cat script/known-failures.txt)"
tree-sitter parse -q \
'examples/**/*.cs' \
$(for file in $known_failures; do echo "!${file}"; done)
example_count=$(find examples -name '*.cs' | wc -l)
failure_count=$(wc -w <<< "$known_failures")
success_count=$(( $example_count - $failure_count ))
success_percent=$(bc -l <<< "100*${success_count}/${example_count}")
printf \
"Successfully parsed %d of %d example files (%.1f%%)\n" \
$success_count $example_count $success_percent

@ -0,0 +1,7 @@
#!/bin/bash
set -eu
find examples -name '*.cs' -print0 | \
xargs -0 -n 1000 tree-sitter parse -q | \
tee >(cut -d' ' -f1 | sort > script/known-failures.txt)

@ -0,0 +1,28 @@
#include "tree_sitter/parser.h"
#include <node.h>
#include "nan.h"
using namespace v8;
extern "C" TSLanguage * tree_sitter_c_sharp();
namespace {
NAN_METHOD(New) {}
void Init(Local<Object> exports, Local<Object> module) {
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked();
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_c_sharp());
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("c_sharp").ToLocalChecked());
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
}
NODE_MODULE(tree_sitter_c_sharp_binding, Init)
} // namespace

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,29 @@
#include <tree_sitter/parser.h>
#include <wctype.h>
enum TokenType {
PREPROC_DIRECTIVE_END,
};
void *tree_sitter_c_sharp_external_scanner_create() { return NULL; }
void tree_sitter_c_sharp_external_scanner_destroy(void *p) {}
void tree_sitter_c_sharp_external_scanner_reset(void *p) {}
unsigned tree_sitter_c_sharp_external_scanner_serialize(void *p, char *buffer) { return 0; }
void tree_sitter_c_sharp_external_scanner_deserialize(void *p, const char *b, unsigned n) {}
bool tree_sitter_c_sharp_external_scanner_scan(
void *payload,
TSLexer *lexer,
const bool *valid_symbols
) {
// Detect either a newline or EOF. Currently, external scanners
// are the only way to match against EOF.
if (!valid_symbols[PREPROC_DIRECTIVE_END]) return false;
lexer->result_symbol = PREPROC_DIRECTIVE_END;
for (;;) {
if (lexer->lookahead == 0) return true;
if (lexer->lookahead == '\n') return true;
if (!iswspace(lexer->lookahead)) return false;
lexer->advance(lexer, true);
}
}

@ -0,0 +1,223 @@
#ifndef TREE_SITTER_PARSER_H_
#define TREE_SITTER_PARSER_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#define ts_builtin_sym_error ((TSSymbol)-1)
#define ts_builtin_sym_end 0
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
typedef uint16_t TSStateId;
#ifndef TREE_SITTER_API_H_
typedef uint16_t TSSymbol;
typedef uint16_t TSFieldId;
typedef struct TSLanguage TSLanguage;
#endif
typedef struct {
TSFieldId field_id;
uint8_t child_index;
bool inherited;
} TSFieldMapEntry;
typedef struct {
uint16_t index;
uint16_t length;
} TSFieldMapSlice;
typedef struct {
bool visible;
bool named;
bool supertype;
} TSSymbolMetadata;
typedef struct TSLexer TSLexer;
struct TSLexer {
int32_t lookahead;
TSSymbol result_symbol;
void (*advance)(TSLexer *, bool);
void (*mark_end)(TSLexer *);
uint32_t (*get_column)(TSLexer *);
bool (*is_at_included_range_start)(const TSLexer *);
bool (*eof)(const TSLexer *);
};
typedef enum {
TSParseActionTypeShift,
TSParseActionTypeReduce,
TSParseActionTypeAccept,
TSParseActionTypeRecover,
} TSParseActionType;
typedef union {
struct {
uint8_t type;
TSStateId state;
bool extra;
bool repetition;
} shift;
struct {
uint8_t type;
uint8_t child_count;
TSSymbol symbol;
int16_t dynamic_precedence;
uint16_t production_id;
} reduce;
uint8_t type;
} TSParseAction;
typedef struct {
uint16_t lex_state;
uint16_t external_lex_state;
} TSLexMode;
typedef union {
TSParseAction action;
struct {
uint8_t count;
bool reusable;
} entry;
} TSParseActionEntry;
struct TSLanguage {
uint32_t version;
uint32_t symbol_count;
uint32_t alias_count;
uint32_t token_count;
uint32_t external_token_count;
uint32_t state_count;
uint32_t large_state_count;
uint32_t production_id_count;
uint32_t field_count;
uint16_t max_alias_sequence_length;
const uint16_t *parse_table;
const uint16_t *small_parse_table;
const uint32_t *small_parse_table_map;
const TSParseActionEntry *parse_actions;
const char * const *symbol_names;
const char * const *field_names;
const TSFieldMapSlice *field_map_slices;
const TSFieldMapEntry *field_map_entries;
const TSSymbolMetadata *symbol_metadata;
const TSSymbol *public_symbol_map;
const uint16_t *alias_map;
const TSSymbol *alias_sequences;
const TSLexMode *lex_modes;
bool (*lex_fn)(TSLexer *, TSStateId);
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
TSSymbol keyword_capture_token;
struct {
const bool *states;
const TSSymbol *symbol_map;
void *(*create)(void);
void (*destroy)(void *);
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
unsigned (*serialize)(void *, char *);
void (*deserialize)(void *, const char *, unsigned);
} external_scanner;
};
/*
* Lexer Macros
*/
#define START_LEXER() \
bool result = false; \
bool skip = false; \
bool eof = false; \
int32_t lookahead; \
goto start; \
next_state: \
lexer->advance(lexer, skip); \
start: \
skip = false; \
lookahead = lexer->lookahead;
#define ADVANCE(state_value) \
{ \
state = state_value; \
goto next_state; \
}
#define SKIP(state_value) \
{ \
skip = true; \
state = state_value; \
goto next_state; \
}
#define ACCEPT_TOKEN(symbol_value) \
result = true; \
lexer->result_symbol = symbol_value; \
lexer->mark_end(lexer);
#define END_STATE() return result;
/*
* Parse Table Macros
*/
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
#define STATE(id) id
#define ACTIONS(id) id
#define SHIFT(state_value) \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.state = state_value \
} \
}}
#define SHIFT_REPEAT(state_value) \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.state = state_value, \
.repetition = true \
} \
}}
#define SHIFT_EXTRA() \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.extra = true \
} \
}}
#define REDUCE(symbol_val, child_count_val, ...) \
{{ \
.reduce = { \
.type = TSParseActionTypeReduce, \
.symbol = symbol_val, \
.child_count = child_count_val, \
__VA_ARGS__ \
}, \
}}
#define RECOVER() \
{{ \
.type = TSParseActionTypeRecover \
}}
#define ACCEPT_INPUT() \
{{ \
.type = TSParseActionTypeAccept \
}}
#ifdef __cplusplus
}
#endif
#endif // TREE_SITTER_PARSER_H_

@ -0,0 +1,3 @@
console.log("Trying to require index.js in JavaScript");
require('.')
console.log("Require successfull");

@ -0,0 +1,14 @@
namespace World
{
class Hello {
static void Main(string []args)
{
Hello x = new Hello();
System.Console.WriteLine("Hello, world.");
}
}
interface Blah {
}
}