github-linguist / linguist

Language Savant. If your repository's language is being reported incorrectly, send us a pull request!
MIT License
12.11k stars 4.19k forks source link

Add more C# language features and syntax sugar to highlightning #5838

Closed deeprobin closed 2 years ago

deeprobin commented 2 years ago

Describe the enhancement

Currently not all syntax features of C# are highlighted. My suggestion includes the following (if you would find something missing, feel free to add):

Missing features

For the sake of completeness, I have tried to explicitly assign a feature to a language version here. I could not find the associated standard/proposal for each feature but they do exist.

Standard (Draft v6)

C# language standard - ECMA-TC49-TG2

Unsafe blocks (ECMA Draftv6 22.2)

public void Method() {
    unsafe {
        // Unsafe operations
    }
}

Pointers & pointer fixture (ECMA Draftv6 22.7)

public unsafe void Method() {
    fixed(int* ptr = &refVar) {
        // Some cool pointer operations
    }
}

C# 9

Native Integer Primitives (CSharp 9.0 Proposal)

public void Method() {
    nint myNativeInteger = -123;
    nuint myNativeUnsignedInteger = 123;
}
public void Method(nint param1, nuint param2) {}

Function pointers (CSharp 9.0 Proposal)

public void Method() {
    delegate* managed<int, int>;
    delegate* unmanaged<int, int>;
    delegate* unmanaged[Cdecl] <int, int>;
    delegate* unmanaged[Stdcall, SuppressGCTransition] <int, int>;
}

Static anonymous functions (CSharp 9.0 Proposal)

public void X() {
    Y(static (i) => i + 1);
    Y(static i => i + 1);
}

public void Y(Func<int, int> x) {}

With expressions (CSharp 9.0 Proposal)

public record MyRecord(string Name);
public MyRecord ModifyName(MyRecord rec) {
    return rec with { Name = "My new name" };
}

C# 10

Global Using Directives (CSharp 10.0 Proposal)

global using System;
global using System.Linq;
global using System.Runtime.CompilerServices;

Records (CSharp 10.0 Proposal)

public partial record struct Record {}
public partial sealed record Record {}
public record struct Record {}
public sealed record Record {}

Enhanced Pattern Matching (CSharp 9.0 Proposal + CSharp 10.0 Proposal)

void M(object o1, object o2)
{
    var t = (o1, o2);
    if (t is (int, string)) {} 
    switch (o1) {
        case int: break; 
        case string: break; 
    }
}

bool IsLetter(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');
Null checks
public void Method(object? nullable) {
    if(nullable is null) {}
    if(nullable is not null) {}
}

Defaults

public void X() {
    int x = default;
}

implicit new

public void Method() {
    MyKnownType value = new();
}

Wrong implemented features

Extension method resolving

namespace N1
{
    public static class D
    {
        public static void F(this int i) => Console.WriteLine($"D.F({i})");
    }
}

namespace N2
{
    using N1;

    class Test
    {
        static void Main(string[] args)
        {
            1.F();
            // ^^ Why is this red?
        }
    }
}
Nixinova commented 2 years ago

Highlighting is done by external grammar repos - see the list here. In this case C#'s highlighting is done by this repo. You should repost this to that repo. Linguist will automatically pick up the changes on its next release.

lildude commented 2 years ago

Closing as this is not a problem with Linguist