Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Report diagnostics in generator #158

Merged
4 changes: 4 additions & 0 deletions DllImportGenerator/Demo/Demo.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>preview</LangVersion>

<!-- Indicate to the compiler to output generated files to disk. Source addded
by the DllImportGenerator can be found in the intermediate directory. -->
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>

<!-- See https://github.com/dotnet/runtime/issues/42745 for why this is needed. -->
<UseAppHost>true</UseAppHost>
</PropertyGroup>
Expand Down
116 changes: 88 additions & 28 deletions DllImportGenerator/DllImportGenerator.UnitTests/Compiles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace DllImportGenerator.UnitTests
{
public class Compiles
{
public static IEnumerable<object[]> CodeSnippetsToCompile()
public static IEnumerable<object[]> CodeSnippetsToCompile_NoDiagnostics()
{
yield return new[] { CodeSnippets.TrivialClassDeclarations };
yield return new[] { CodeSnippets.TrivialStructDeclarations };
Expand All @@ -20,7 +20,7 @@ public static IEnumerable<object[]> CodeSnippetsToCompile()
yield return new[] { CodeSnippets.AllDllImportNamedArguments };
yield return new[] { CodeSnippets.DefaultParameters };
yield return new[] { CodeSnippets.UseCSharpFeaturesForConstants };
yield return new[] { CodeSnippets.MarshalAsAttributeOnTypes };
//yield return new[] { CodeSnippets.MarshalAsAttributeOnTypes };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<byte>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<sbyte>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<short>() };
Expand All @@ -32,10 +32,74 @@ public static IEnumerable<object[]> CodeSnippetsToCompile()
yield return new[] { CodeSnippets.BasicParametersAndModifiers<float>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<double>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<bool>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<char>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<string>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<char>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<string>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<IntPtr>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<UIntPtr>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<byte[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<sbyte[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<short[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<ushort[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<int[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<uint[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<long[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<ulong[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<float[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<double[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<bool[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<char[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<string[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<IntPtr[]>() };
//yield return new[] { CodeSnippets.BasicParametersAndModifiers<UIntPtr[]>() };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.Bool) };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.VariantBool) };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.I1) };
//yield return new[] { CodeSnippets.EnumParameters };
yield return new[] { CodeSnippets.PreserveSigFalseVoidReturn };
yield return new[] { CodeSnippets.PreserveSigFalse<byte>() };
yield return new[] { CodeSnippets.PreserveSigFalse<sbyte>() };
yield return new[] { CodeSnippets.PreserveSigFalse<short>() };
yield return new[] { CodeSnippets.PreserveSigFalse<ushort>() };
yield return new[] { CodeSnippets.PreserveSigFalse<int>() };
yield return new[] { CodeSnippets.PreserveSigFalse<uint>() };
yield return new[] { CodeSnippets.PreserveSigFalse<long>() };
yield return new[] { CodeSnippets.PreserveSigFalse<ulong>() };
yield return new[] { CodeSnippets.PreserveSigFalse<float>() };
yield return new[] { CodeSnippets.PreserveSigFalse<double>() };
yield return new[] { CodeSnippets.PreserveSigFalse<bool>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<char>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<string>() };
yield return new[] { CodeSnippets.PreserveSigFalse<IntPtr>() };
yield return new[] { CodeSnippets.PreserveSigFalse<UIntPtr>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<byte[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<sbyte[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<short[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<ushort[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<int[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<uint[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<long[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<ulong[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<float[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<double[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<bool[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<char[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<string[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<IntPtr[]>() };
//yield return new[] { CodeSnippets.PreserveSigFalse<UIntPtr[]>() };
yield return new[] { CodeSnippets.DelegateParametersAndModifiers };
yield return new[] { CodeSnippets.DelegateMarshalAsParametersAndModifiers };
yield return new[] { CodeSnippets.BlittableStructParametersAndModifiers };
yield return new[] { CodeSnippets.GenericBlittableStructParametersAndModifiers };
yield return new[] { CodeSnippets.BasicParametersAndModifiers("Microsoft.Win32.SafeHandles.SafeFileHandle") };
}

public static IEnumerable<object[]> CodeSnippetsToCompile_WithDiagnostics()
{
yield return new[] { CodeSnippets.MarshalAsAttributeOnTypes };

yield return new[] { CodeSnippets.BasicParametersAndModifiers<char>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<string>() };

yield return new[] { CodeSnippets.BasicParametersAndModifiers<byte[]>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<sbyte[]>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<short[]>() };
Expand All @@ -51,26 +115,12 @@ public static IEnumerable<object[]> CodeSnippetsToCompile()
yield return new[] { CodeSnippets.BasicParametersAndModifiers<string[]>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<IntPtr[]>() };
yield return new[] { CodeSnippets.BasicParametersAndModifiers<UIntPtr[]>() };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.Bool) };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.VariantBool) };
yield return new[] { CodeSnippets.MarshalAsParametersAndModifiers<bool>(UnmanagedType.I1) };

yield return new[] { CodeSnippets.EnumParameters };
yield return new[] { CodeSnippets.PreserveSigFalseVoidReturn };
yield return new[] { CodeSnippets.PreserveSigFalse<byte>() };
yield return new[] { CodeSnippets.PreserveSigFalse<sbyte>() };
yield return new[] { CodeSnippets.PreserveSigFalse<short>() };
yield return new[] { CodeSnippets.PreserveSigFalse<ushort>() };
yield return new[] { CodeSnippets.PreserveSigFalse<int>() };
yield return new[] { CodeSnippets.PreserveSigFalse<uint>() };
yield return new[] { CodeSnippets.PreserveSigFalse<long>() };
yield return new[] { CodeSnippets.PreserveSigFalse<ulong>() };
yield return new[] { CodeSnippets.PreserveSigFalse<float>() };
yield return new[] { CodeSnippets.PreserveSigFalse<double>() };
yield return new[] { CodeSnippets.PreserveSigFalse<bool>() };

yield return new[] { CodeSnippets.PreserveSigFalse<char>() };
yield return new[] { CodeSnippets.PreserveSigFalse<string>() };
yield return new[] { CodeSnippets.PreserveSigFalse<IntPtr>() };
yield return new[] { CodeSnippets.PreserveSigFalse<UIntPtr>() };

yield return new[] { CodeSnippets.PreserveSigFalse<byte[]>() };
yield return new[] { CodeSnippets.PreserveSigFalse<sbyte[]>() };
yield return new[] { CodeSnippets.PreserveSigFalse<short[]>() };
Expand All @@ -86,16 +136,11 @@ public static IEnumerable<object[]> CodeSnippetsToCompile()
yield return new[] { CodeSnippets.PreserveSigFalse<string[]>() };
yield return new[] { CodeSnippets.PreserveSigFalse<IntPtr[]>() };
yield return new[] { CodeSnippets.PreserveSigFalse<UIntPtr[]>() };
yield return new[] { CodeSnippets.DelegateParametersAndModifiers };
yield return new[] { CodeSnippets.DelegateMarshalAsParametersAndModifiers };
yield return new[] { CodeSnippets.BlittableStructParametersAndModifiers };
yield return new[] { CodeSnippets.GenericBlittableStructParametersAndModifiers };
yield return new[] { CodeSnippets.BasicParametersAndModifiers("Microsoft.Win32.SafeHandles.SafeFileHandle") };
}

[Theory]
[MemberData(nameof(CodeSnippetsToCompile))]
public async Task ValidateSnippets(string source)
[MemberData(nameof(CodeSnippetsToCompile_NoDiagnostics))]
public async Task ValidateSnippets_NoDiagnostics(string source)
{
Compilation comp = await TestUtils.CreateCompilation(source);
TestUtils.AssertPreSourceGeneratorCompilation(comp);
Expand All @@ -106,5 +151,20 @@ public async Task ValidateSnippets(string source)
var newCompDiags = newComp.GetDiagnostics();
Assert.Empty(newCompDiags);
}

[Theory]
[MemberData(nameof(CodeSnippetsToCompile_WithDiagnostics))]
public async Task ValidateSnippets_WithDiagnostics(string source)
{
Compilation comp = await TestUtils.CreateCompilation(source);
TestUtils.AssertPreSourceGeneratorCompilation(comp);

var newComp = TestUtils.RunGenerators(comp, out var generatorDiags, new Microsoft.Interop.DllImportGenerator());
Assert.NotEmpty(generatorDiags);
Assert.All(generatorDiags, d => Assert.StartsWith(Microsoft.Interop.GeneratorDiagnostics.Ids.Prefix, d.Id));

var newCompDiags = newComp.GetDiagnostics();
Assert.Empty(newCompDiags);
}
}
}
Loading