Skip to content

Commit

Permalink
Report diagnostics in generator (#158)
Browse files Browse the repository at this point in the history
  • Loading branch information
elinor-fung authored Oct 10, 2020
1 parent 6c980df commit 98f55be
Show file tree
Hide file tree
Showing 16 changed files with 866 additions and 151 deletions.
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

0 comments on commit 98f55be

Please sign in to comment.