Skip to content

Commit 763a24b

Browse files
Merge pull request #1221 from icsharpcode/reference-assemblies
Cross platform experimentation - reference assemblies
2 parents 2663a25 + 74f229d commit 763a24b

File tree

8 files changed

+102
-25
lines changed

8 files changed

+102
-25
lines changed

CodeConverter/CSharp/NameExpressionNodeVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public async Task<CSharpSyntaxNode> ConvertMemberAccessExpressionAsync(VBasic.Sy
5252

5353
var simpleNameSyntax = await node.Name.AcceptAsync<SimpleNameSyntax>(TriviaConvertingExpressionVisitor);
5454

55-
var isDefaultProperty = nodeSymbol is IPropertySymbol p && VBasic.VisualBasicExtensions.IsDefault(p);
55+
var isDefaultProperty = nodeSymbol is IPropertySymbol p && VBasic.VisualBasicExtensions.IsDefault(p) && p.Parameters.Any();
5656
ExpressionSyntax left = null;
5757
if (node.Expression is VBasic.Syntax.MyClassExpressionSyntax && nodeSymbol != null) {
5858
if (nodeSymbol.IsStatic) {

Tests/CSharp/ExpressionTests/ExpressionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ public VisualBasicClass()
578578
}
579579
}
580580
1 target compilation errors:
581-
CS1503: Argument 1: cannot convert from 'object' to 'string'");
581+
CS1503: Argument 1: cannot convert from 'object' to 'System.ReadOnlySpan<char>'");
582582
}
583583

584584
[Fact]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Threading.Tasks;
2+
using ICSharpCode.CodeConverter.Tests.TestRunners;
3+
using Xunit;
4+
5+
namespace ICSharpCode.CodeConverter.Tests.CSharp.MemberTests;
6+
7+
public class DefaultMemberAttributeTests : ConverterTestBase
8+
{
9+
[Fact]
10+
public async Task TestDefaultMemberAttributeConversionAsync()
11+
{
12+
await TestConversionVisualBasicToCSharpAsync(
13+
@"
14+
<System.Reflection.DefaultMember(""Caption"")>
15+
Public Class ClassWithReflectionDefaultMember
16+
Public Property Caption As String
17+
End Class
18+
19+
<System.Reflection.DefaultMember(NameOf(LoosingProperties.Caption))>
20+
Public Class LoosingProperties
21+
Public Property Caption As String
22+
23+
Sub S()
24+
Dim x = New LoosingProperties()
25+
x.Caption = ""Hello""
26+
27+
Dim y = New ClassWithReflectionDefaultMember() 'from C#
28+
y.Caption = ""World""
29+
End Sub
30+
End Class", @"using System.Reflection;
31+
32+
[DefaultMember(""Caption"")]
33+
public partial class ClassWithReflectionDefaultMember
34+
{
35+
public string Caption { get; set; }
36+
}
37+
38+
[DefaultMember(nameof(Caption))]
39+
public partial class LoosingProperties
40+
{
41+
public string Caption { get; set; }
42+
43+
public void S()
44+
{
45+
var x = new LoosingProperties();
46+
x.Caption = ""Hello"";
47+
48+
var y = new ClassWithReflectionDefaultMember(); // from C#
49+
y.Caption = ""World"";
50+
}
51+
}
52+
");
53+
}
54+
}

Tests/CSharp/MissingSemanticModelInfo/ExpressionTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,7 @@ Sub Foo()
103103
104104
Next
105105
End Sub
106-
End Class", @"using System.Linq;
107-
106+
End Class", @"
108107
public partial class Class1
109108
{
110109
public void Foo()

Tests/DefaultReferences.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
4+
using System.Reflection;
5+
using Microsoft.CodeAnalysis;
6+
7+
namespace ICSharpCode.CodeConverter.Common;
8+
9+
/// <summary>
10+
/// Provides reference assemblies for use in Roslyn compilations during tests.
11+
/// Uses Basic.Reference.Assemblies packages to avoid platform-specific assembly loading.
12+
/// </summary>
13+
public static class DefaultReferences
14+
{
15+
public static IReadOnlyCollection<PortableExecutableReference> NetStandard2 { get; } =
16+
Basic.Reference.Assemblies.NetStandard20.References.All;
17+
18+
private static readonly IReadOnlyCollection<PortableExecutableReference> _net80All =
19+
Basic.Reference.Assemblies.Net80.References.All
20+
.Concat(Basic.Reference.Assemblies.Net80Windows.References.All)
21+
.ToArray();
22+
23+
public static IReadOnlyCollection<PortableExecutableReference> With(params Assembly[] assemblies) =>
24+
_net80All
25+
.Concat(RefsFromAssemblies(assemblies))
26+
.ToArray();
27+
28+
private static IEnumerable<PortableExecutableReference> RefsFromAssemblies(Assembly[] assemblies) =>
29+
assemblies
30+
.Where(a => !a.IsDynamic && !string.IsNullOrEmpty(a.Location) && File.Exists(a.Location))
31+
.Select(a => MetadataReference.CreateFromFile(a.Location));
32+
}

Tests/TestRunners/ConverterTestBase.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ public ConverterTestBase(string rootNamespace = null)
4848
}
4949

5050
private static IReadOnlyCollection<PortableExecutableReference> References { get; } = DefaultReferences.With(
51-
typeof(System.Windows.Forms.Form).Assembly,
52-
typeof(Microsoft.VisualBasic.Devices.Computer).Assembly,
5351
typeof(System.Data.SqlClient.SqlConnection).Assembly
5452
);
5553

Tests/Tests.csproj

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFramework>net10.0-windows</TargetFramework>
3+
<TargetFramework>net10.0</TargetFramework>
44
<OutputType>Library</OutputType>
55
<AssemblyName>ICSharpCode.CodeConverter.Tests</AssemblyName>
66
<RootNamespace>ICSharpCode.CodeConverter.Tests</RootNamespace>
77
<DisableMSBuildAssemblyCopyCheck>true</DisableMSBuildAssemblyCopyCheck>
8-
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
9-
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
10-
<UseWindowsForms>true</UseWindowsForms>
118
<WarningsNotAsErrors>NU1510;NU1903</WarningsNotAsErrors>
129
</PropertyGroup>
1310
<ItemGroup>
@@ -24,21 +21,18 @@
2421
</PackageReference>
2522
</ItemGroup>
2623
<ItemGroup>
27-
<!-- So we can reference commonly referenced assemblies in created compilations-->
24+
<!-- Reference assemblies for use in created compilations during tests -->
25+
<PackageReference Include="Basic.Reference.Assemblies.Net80" Version="1.8.4" />
26+
<PackageReference Include="Basic.Reference.Assemblies.Net80Windows" Version="1.8.4" />
27+
<PackageReference Include="Basic.Reference.Assemblies.NetStandard20" Version="1.8.4" />
28+
<!-- SqlClient is not in the standard reference packs -->
2829
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
29-
<PackageReference Include="System.Formats.Asn1" Version="8.0.1" />
30-
<PackageReference Include="System.Memory" Version="4.5.5" />
31-
<PackageReference Include="System.Net.Http" Version="4.3.4" />
32-
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
33-
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
34-
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
3530
</ItemGroup>
3631
<ItemGroup>
3732
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
3833
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
3934
</ItemGroup>
4035
<ItemGroup>
41-
<Compile Include="..\CodeConverter\Common\DefaultReferences.cs" Link="DefaultReferences.cs" />
4236
<Compile Remove="TestData\**" />
4337
<EmbeddedResource Remove="TestData\**" />
4438
<None Include="TestData\**\*.*" />

Tests/VB/MemberTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,33 +1308,33 @@ End Class
13081308
15 source compilation errors:
13091309
CS1002: ; expected
13101310
CS0535: 'TestClass' does not implement interface member 'IList.Add(object?)'
1311-
CS0535: 'TestClass' does not implement interface member 'IList.Contains(object?)'
13121311
CS0535: 'TestClass' does not implement interface member 'IList.Clear()'
1312+
CS0535: 'TestClass' does not implement interface member 'IList.Contains(object?)'
13131313
CS0535: 'TestClass' does not implement interface member 'IList.IndexOf(object?)'
13141314
CS0535: 'TestClass' does not implement interface member 'IList.Insert(int, object?)'
13151315
CS0535: 'TestClass' does not implement interface member 'IList.Remove(object?)'
13161316
CS0535: 'TestClass' does not implement interface member 'IList.RemoveAt(int)'
1317-
CS0535: 'TestClass' does not implement interface member 'IList.IsReadOnly'
13181317
CS0535: 'TestClass' does not implement interface member 'IList.IsFixedSize'
1318+
CS0535: 'TestClass' does not implement interface member 'IList.IsReadOnly'
13191319
CS0535: 'TestClass' does not implement interface member 'ICollection.CopyTo(Array, int)'
13201320
CS0535: 'TestClass' does not implement interface member 'ICollection.Count'
1321-
CS0535: 'TestClass' does not implement interface member 'ICollection.SyncRoot'
13221321
CS0535: 'TestClass' does not implement interface member 'ICollection.IsSynchronized'
1322+
CS0535: 'TestClass' does not implement interface member 'ICollection.SyncRoot'
13231323
CS0535: 'TestClass' does not implement interface member 'IEnumerable.GetEnumerator()'
13241324
14 target compilation errors:
13251325
BC30149: Class 'TestClass' must implement 'Function Add(value As Object) As Integer' for interface 'IList'.
1326-
BC30149: Class 'TestClass' must implement 'Function Contains(value As Object) As Boolean' for interface 'IList'.
13271326
BC30149: Class 'TestClass' must implement 'Sub Clear()' for interface 'IList'.
1327+
BC30149: Class 'TestClass' must implement 'Function Contains(value As Object) As Boolean' for interface 'IList'.
13281328
BC30149: Class 'TestClass' must implement 'Function IndexOf(value As Object) As Integer' for interface 'IList'.
13291329
BC30149: Class 'TestClass' must implement 'Sub Insert(index As Integer, value As Object)' for interface 'IList'.
13301330
BC30149: Class 'TestClass' must implement 'Sub Remove(value As Object)' for interface 'IList'.
13311331
BC30149: Class 'TestClass' must implement 'Sub RemoveAt(index As Integer)' for interface 'IList'.
1332-
BC30149: Class 'TestClass' must implement 'ReadOnly Property IsReadOnly As Boolean' for interface 'IList'.
13331332
BC30149: Class 'TestClass' must implement 'ReadOnly Property IsFixedSize As Boolean' for interface 'IList'.
1333+
BC30149: Class 'TestClass' must implement 'ReadOnly Property IsReadOnly As Boolean' for interface 'IList'.
13341334
BC30149: Class 'TestClass' must implement 'Sub CopyTo(array As Array, index As Integer)' for interface 'ICollection'.
13351335
BC30149: Class 'TestClass' must implement 'ReadOnly Property Count As Integer' for interface 'ICollection'.
1336-
BC30149: Class 'TestClass' must implement 'ReadOnly Property SyncRoot As Object' for interface 'ICollection'.
13371336
BC30149: Class 'TestClass' must implement 'ReadOnly Property IsSynchronized As Boolean' for interface 'ICollection'.
1337+
BC30149: Class 'TestClass' must implement 'ReadOnly Property SyncRoot As Object' for interface 'ICollection'.
13381338
BC30149: Class 'TestClass' must implement 'Function GetEnumerator() As IEnumerator' for interface 'IEnumerable'.");
13391339
}
13401340
[Fact]

0 commit comments

Comments
 (0)