dotnet / dotnet/fsharp

TAST issues with Unions with values

Open
#8,854 1 comment 0 reactions 1 assignee Claimed by @edgarfgp View on GitHub
Area-FCS Feature Request
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 11h
Merged PRs (30d)
131

Description

Hey there! I've been working on some F# Analyzers using the [SDK](https://github.com/ionide/FSharp.Analyzers.SDK) project. While running against the Typed AST I've a problem. When trying to get a TAST with a union that contains values such as `type Foo = | Bar of int`, I get an exception ` FSharp.Compiler.Service cannot yet return this kind of pattern match ` in the results: and other types are no longer resolved. This results in my analyzers failing to find any problems with the source code.

TAST without the DU


File without DU

```fsharp
module md5create
open System.Security.Cryptography
open System.Text

let foo () =
use md5 = MD5.Create()
md5.ComputeHash(UTF8Encoding().GetBytes("foo"))

```

```
[Entity
(md5create,
[MemberOrFunctionOrValue
(val foo,[[val unitVar0]],
Let
((val md5, Call (None,member Create,[],[],[])),
TryFinally
(Call
(Some Value val md5,member ComputeHash,[],[],
[Call
(Some NewObject (member .ctor,[],[]),member GetBytes,[],[],
[Const ("foo",type Microsoft.FSharp.Core.string)])]),
IfThenElse
(TypeTest
(type System.IDisposable,Coerce (type Microsoft.FSharp.Core.obj,Value val md5)),
Call
(Some
Call
(None,val UnboxGeneric,[],[type System.IDisposable],
[Coerce (type Microsoft.FSharp.Core.obj,Value val md5)]),
member Dispose,[],[],[]),
Const (null,type Microsoft.FSharp.Core.unit)))))])]
```


File with DU

```fsharp
module md5create
open System.Security.Cryptography
open System.Text

type Foo = | Bar of int

let foo () =
use md5 = MD5.Create()
md5.ComputeHash(UTF8Encoding().GetBytes("foo"))

```

TAST with the DU

```
[Entity
(md5create,
[Entity (Foo,[]);
MemberOrFunctionOrValue
(member CompareTo,[[val this]; [val obj]],
);
MemberOrFunctionOrValue
(member CompareTo,[[val this]; [val obj]],
Call
(Some Value val this,member CompareTo,[],[],
[Coerce (type md5create.Foo,Value val obj)]));
MemberOrFunctionOrValue
(member CompareTo,[[val this]; [val obj; val comp]],
);
MemberOrFunctionOrValue
(member GetHashCode,[[val this]; [val comp]],
);
MemberOrFunctionOrValue
(member GetHashCode,[[val this]; [val unitArg]],
Call
(Some Value val this,member GetHashCode,[],[],
[ILAsm
("[I_call
(Normalcall,
Microsoft.FSharp.Core.LanguagePrimitives::get_GenericEqualityComparer(...)(...),
None)]",
[],[])]));
MemberOrFunctionOrValue
(member Equals,[[val this]; [val obj; val comp]],
);
MemberOrFunctionOrValue
(member Equals,[[val this]; [val obj]],
);
MemberOrFunctionOrValue
(member Equals,[[val this]; [val obj]],
IfThenElse
(TypeTest (type md5create.Foo,Value val obj),
Call
(Some Value val this,member Equals,[],[],
[Call (None,val UnboxGeneric,[],[type md5create.Foo],[Value val obj])]),
Const (false,type Microsoft.FSharp.Core.bool)));
MemberOrFunctionOrValue
(val foo,[[val unitVar0]],
Let
((val md5, Call (None,member Create,[],[],[])),
TryFinally
(Call
(Some Value val md5,member ComputeHash,[],[],
[Call
(Some NewObject (member .ctor,[],[]),member GetBytes,[],[],
[Const ("foo",type Microsoft.FSharp.Core.string)])]),
IfThenElse
(TypeTest
(type System.IDisposable,Coerce (type Microsoft.FSharp.Core.obj,Value val md5)),
Call
(Some
Call
(None,val UnboxGeneric,[],[type System.IDisposable],
[Coerce (type Microsoft.FSharp.Core.obj,Value val md5)]),
member Dispose,[],[],[]),
Const (null,type Microsoft.FSharp.Core.unit)))))])]
```

**Repro steps**

Provide the steps required to reproduce the problem:

1. Clone: https://github.com/BinaryDefense/BinaryDefense.FSharp.Analyzers
2. run `./build.sh dotnettest` (or cmd if on windows)
3. See tests succeed
4. Edit `tests/examples/hashing/md5create.fs` and add `type Foo = | Bar of int`
5. run `./build.sh dotnettest` (or cmd if on windows)
6. See tests fail

If possible attach a zip file with the repro case. This often makes it easier for others to reproduce.
The zip file should ideally represent the situation just before the call/step that is problematic.

**Expected behavior**

Provide a description of the expected behavior.

**Actual behavior**

Provide a description of the actual behaviour observed.

**Known workarounds**

Provide a description of any known workarounds.

**Related information**

Provide any related information (optional):

```FSharp.Compiler.Service (34.1.1)```.

* Operating system:
macOS

* .NET Runtime kind (.NET Core, .NET Framework, Mono)

$ dotnet --info
```
.NET Core SDK (reflecting any global.json):
Version: 3.1.200
Commit: c5123d973b

Runtime Environment:
OS Name: Mac OS X
OS Version: 10.14
OS Platform: Darwin
RID: osx.10.14-x64
Base Path: /usr/local/share/dotnet/sdk/3.1.200/

Host (useful for support):
Version: 3.1.2
Commit: 916b5cba26

.NET Core SDKs installed:
1.0.0-preview2.1-003155 [/usr/local/share/dotnet/sdk]
1.0.0-preview2-003121 [/usr/local/share/dotnet/sdk]
1.0.0-preview2-003131 [/usr/local/share/dotnet/sdk]
1.0.0-preview2-003156 [/usr/local/share/dotnet/sdk]
1.0.0-preview2-1-003177 [/usr/local/share/dotnet/sdk]
1.0.0-preview4-004233 [/usr/local/share/dotnet/sdk]
1.0.0-rc4-004711 [/usr/local/share/dotnet/sdk]
1.0.0-rc4-004771 [/usr/local/share/dotnet/sdk]
1.0.1 [/usr/local/share/dotnet/sdk]
1.0.4 [/usr/local/share/dotnet/sdk]
2.0.0 [/usr/local/share/dotnet/sdk]
2.0.3 [/usr/local/share/dotnet/sdk]
2.1.3 [/usr/local/share/dotnet/sdk]
2.1.4 [/usr/local/share/dotnet/sdk]
2.1.101 [/usr/local/share/dotnet/sdk]
2.1.200 [/usr/local/share/dotnet/sdk]
2.1.300-rc1-008673 [/usr/local/share/dotnet/sdk]
2.1.300 [/usr/local/share/dotnet/sdk]
2.1.401 [/usr/local/share/dotnet/sdk]
2.1.403 [/usr/local/share/dotnet/sdk]
2.1.603 [/usr/local/share/dotnet/sdk]
2.1.802 [/usr/local/share/dotnet/sdk]
2.2.102 [/usr/local/share/dotnet/sdk]
2.2.104 [/usr/local/share/dotnet/sdk]
2.2.105 [/usr/local/share/dotnet/sdk]
2.2.203 [/usr/local/share/dotnet/sdk]
3.0.100-preview7-012821 [/usr/local/share/dotnet/sdk]
3.0.100-preview8-013656 [/usr/local/share/dotnet/sdk]
3.0.100-preview9-014004 [/usr/local/share/dotnet/sdk]
3.0.100 [/usr/local/share/dotnet/sdk]
3.1.100 [/usr/local/share/dotnet/sdk]
3.1.102 [/usr/local/share/dotnet/sdk]
3.1.200 [/usr/local/share/dotnet/sdk]

.NET Core runtimes installed:
Microsoft.AspNetCore.All 2.1.0-rc1-final [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.5 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.10 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.13 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.1 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.2.4 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.0-rc1-final [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.5 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.10 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.13 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.1 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.2.4 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0-preview7.19365.7 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0-preview8.19405.7 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0-preview9.19424.4 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.0.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 1.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.0.1 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.0.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.0.4 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.0.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.1.0-preview1-001100-00 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.1.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.1.1 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 1.1.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.4 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.6 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.0.7 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.0-rc1 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.10 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.13 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.1 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.4 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 2.2.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0-preview7-27912-14 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0-preview9-19423-09 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.