Skip to content

Commit

Permalink
Merge pull request #414 from mrmonday/375-global-names
Browse files Browse the repository at this point in the history
Correctly handle type promoted module symbols [#332, #375, #401]
  • Loading branch information
GrahamTheCoder authored Nov 14, 2019
2 parents fc2f6db + 4bb8e7e commit 0904218
Show file tree
Hide file tree
Showing 22 changed files with 503 additions and 43 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ All notable changes to the code converter will be documented here.
* Convert types in ternary expressions (#363)
* Support for converting dot net standard VB projects (#398)
* Avoid compilation error for duplicate cases (#374)
* Correctly handle type promoted module symbols (#375)
* Prefer renamed imports for name resolution (#401)
* Correctly convert ambiguous names (#332)

### C# -> VB
* Convert property accessors with visiblity modifiers (#92)
Expand Down
2 changes: 1 addition & 1 deletion ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public override async Task<CSharpSyntaxNode> VisitCompilationUnit(VBSyntax.Compi
.SelectAsync(async c => (UsingDirectiveSyntax) await c.Accept(TriviaConvertingVisitor));
var usingDirectiveSyntax = usings
.Concat(_extraUsingDirectives.Select(u => SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(u))))
.GroupBy(u => u.ToString())
.GroupBy(u => (Name: u.Name.ToString(), Alias: u.Alias))
.Select(g => g.First());

return SyntaxFactory.CompilationUnit(
Expand Down
50 changes: 25 additions & 25 deletions ICSharpCode.CodeConverter/CSharp/ExpressionNodeVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -281,10 +281,10 @@ public override async Task<CSharpSyntaxNode> VisitMemberAccessExpression(VBasic.
}
}
if (left == null && nodeSymbol?.IsStatic == true) {
var typeInfo = _semanticModel.GetTypeInfo(node.Expression);
var type = nodeSymbol.ContainingType;
var expressionSymbolInfo = _semanticModel.GetSymbolInfo(node.Expression);
if (typeInfo.Type != null && !expressionSymbolInfo.Symbol.IsType()) {
left = CommonConversions.GetTypeSyntax(typeInfo.Type);
if (type != null && !expressionSymbolInfo.Symbol.IsType()) {
left = CommonConversions.GetTypeSyntax(type);
}
}
if (left == null) {
Expand All @@ -296,9 +296,6 @@ public override async Task<CSharpSyntaxNode> VisitMemberAccessExpression(VBasic.
: (ExpressionSyntax)SyntaxFactory.MemberBindingExpression(simpleNameSyntax);
}
left = _withBlockLhs.Peek();
} else if (TryGetTypePromotedModuleSymbol(node, out var promotedModuleSymbol)) {
left = SyntaxFactory.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, left,
SyntaxFactory.IdentifierName(promotedModuleSymbol.Name));
}

if (node.Expression.IsKind(VBasic.SyntaxKind.GlobalName)) {
Expand Down Expand Up @@ -871,7 +868,6 @@ public override async Task<CSharpSyntaxNode> VisitIdentifierName(VBasic.Syntax.I

var qualifiedIdentifier = !node.Parent.IsKind(VBasic.SyntaxKind.SimpleMemberAccessExpression, VBasic.SyntaxKind.QualifiedName, VBasic.SyntaxKind.NameColonEquals, VBasic.SyntaxKind.ImportsStatement, VBasic.SyntaxKind.NamespaceStatement, VBasic.SyntaxKind.NamedFieldInitializer)
|| node.Parent is VBasic.Syntax.MemberAccessExpressionSyntax maes && maes.Expression == node
|| node.Parent is VBasic.Syntax.QualifiedNameSyntax qns && qns.Left == node
? QualifyNode(node, identifier) : identifier;

var withArgList = AddEmptyArgumentListIfImplicit(node, qualifiedIdentifier);
Expand All @@ -892,6 +888,10 @@ public override async Task<CSharpSyntaxNode> VisitIdentifierName(VBasic.Syntax.I

public override async Task<CSharpSyntaxNode> VisitQualifiedName(VBasic.Syntax.QualifiedNameSyntax node)
{
var symbol = GetSymbolInfoInDocument(node);
if (symbol != null && symbol.IsType()) {
return CommonConversions.GetTypeSyntax(symbol.GetSymbolType());
}
var lhsSyntax = (NameSyntax) await node.Left.AcceptAsync(TriviaConvertingVisitor);
var rhsSyntax = (SimpleNameSyntax) await node.Right.AcceptAsync(TriviaConvertingVisitor);

Expand All @@ -917,7 +917,24 @@ public override async Task<CSharpSyntaxNode> VisitQualifiedName(VBasic.Syntax.Qu

public override async Task<CSharpSyntaxNode> VisitGenericName(VBasic.Syntax.GenericNameSyntax node)
{
return SyntaxFactory.GenericName(ConvertIdentifier(node.Identifier), (TypeArgumentListSyntax) await node.TypeArgumentList.AcceptAsync(TriviaConvertingVisitor));
var name = SyntaxFactory.GenericName(ConvertIdentifier(node.Identifier), (TypeArgumentListSyntax) await node.TypeArgumentList.AcceptAsync(TriviaConvertingVisitor));

if (!node.Parent.IsKind(VBasic.SyntaxKind.SimpleMemberAccessExpression, VBasic.SyntaxKind.QualifiedName)) {
var symbol = GetSymbolInfoInDocument(node);
if (symbol?.ContainingSymbol != null) {
string lhs;
if (symbol.ContainingSymbol.IsType()) {
lhs = CommonConversions.GetTypeSyntax(symbol.ContainingSymbol.GetSymbolType()).ToString();
} else if (symbol.ContainingSymbol.IsNamespace() && symbol.ContainingNamespace.IsGlobalNamespace) {
return SyntaxFactory.AliasQualifiedName("global", name);
} else {
lhs = symbol.ContainingSymbol.ToString();
}
return SyntaxFactory.QualifiedName(SyntaxFactory.ParseName(lhs), name);
}
}

return name;
}

public override async Task<CSharpSyntaxNode> VisitTypeArgumentList(VBasic.Syntax.TypeArgumentListSyntax node)
Expand Down Expand Up @@ -990,23 +1007,6 @@ private ExpressionSyntax GetConvertMethodForKeywordOrNull(SyntaxNode type)
return convertedType != null && _convertMethodsLookupByReturnType.Value.TryGetValue(convertedType, out var convertMethodName)
? SyntaxFactory.ParseExpression(convertMethodName) : null;
}

/// <remarks>https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/declared-elements/type-promotion</remarks>
private bool TryGetTypePromotedModuleSymbol(VBasic.Syntax.MemberAccessExpressionSyntax node, out INamedTypeSymbol moduleSymbol)
{
if (_semanticModel.GetSymbolInfo(node.Expression).ExtractBestMatch() is INamespaceSymbol
expressionSymbol &&
_semanticModel.GetSymbolInfo(node.Name).ExtractBestMatch()?.ContainingSymbol is INamedTypeSymbol
nameContainingSymbol &&
nameContainingSymbol.ContainingSymbol.Equals(expressionSymbol)) {
moduleSymbol = nameContainingSymbol;
return true;
}

moduleSymbol = null;
return false;
}

private static bool IsSubPartOfConditionalAccess(VBasic.Syntax.MemberAccessExpressionSyntax node)
{
var firstPossiblyConditionalAncestor = node.Parent;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WindowsAppVb", "WindowsAppVb\WindowsAppVb.vbproj", "{D18AB89D-1897-4779-A937-F48661E0B6B8}"
EndProject
Expand All @@ -16,7 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EmptyVb", "EmptyVb\EmptyVb.vbproj", "{23195658-FBE7-4A3E-B79D-91AAC2D428E7}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ConsoleApp4", "ConsoleApp4\ConsoleApp4.vbproj", "{68361F37-56E9-4B49-AFF3-F1AF9938A97F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -44,6 +46,10 @@ Global
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.Build.0 = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp4</RootNamespace>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WindowsAppVb", "WindowsAppVb\WindowsAppVb.vbproj", "{D18AB89D-1897-4779-A937-F48661E0B6B8}"
EndProject
Expand All @@ -16,7 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EmptyVb", "EmptyVb\EmptyVb.vbproj", "{23195658-FBE7-4A3E-B79D-91AAC2D428E7}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ConsoleApp4", "ConsoleApp4\ConsoleApp4.vbproj", "{68361F37-56E9-4B49-AFF3-F1AF9938A97F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -44,6 +46,10 @@ Global
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.Build.0 = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp4</RootNamespace>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WindowsAppVb", "WindowsAppVb\WindowsAppVb.vbproj", "{D18AB89D-1897-4779-A937-F48661E0B6B8}"
EndProject
Expand All @@ -16,7 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "EmptyVb", "EmptyVb\EmptyVb.vbproj", "{23195658-FBE7-4A3E-B79D-91AAC2D428E7}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ConsoleApp4", "ConsoleApp4\ConsoleApp4.vbproj", "{68361F37-56E9-4B49-AFF3-F1AF9938A97F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -44,6 +46,10 @@ Global
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.Build.0 = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp4</RootNamespace>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

</Project>
7 changes: 7 additions & 0 deletions TestData/CharacterizationTestSolution/ConsoleApp4/Dict.vb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Namespace A
Public Class Dictionary(Of V, K)
Inherits System.Collections.Generic.Dictionary(Of K, V)
Public Sub New()
End Sub
End Class
End Namespace
11 changes: 11 additions & 0 deletions TestData/CharacterizationTestSolution/ConsoleApp4/Program.vb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Imports ConsoleApp4.A

Friend Class Program
Public Shared Function Foo() As System.Collections.Generic.Dictionary(Of String, String)
Return New Dictionary(Of String, String)()
End Function

Public Shared Sub Main(ByVal args As String())
Dim x As List(Of String) = New List(Of String)()
End Sub
End Class
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WindowsAppVb", "WindowsAppVb\WindowsAppVb.vbproj", "{D18AB89D-1897-4779-A937-F48661E0B6B8}"
EndProject
Expand All @@ -16,7 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmptyVb", "EmptyVb\EmptyVb.csproj", "{913DD733-37BF-05CF-35C5-5BD4A0431C47}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.vbproj", "{FBFBE639-A532-408A-960D-288E05FEEB0E}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ConsoleApp4", "ConsoleApp4\ConsoleApp4.vbproj", "{68361F37-56E9-4B49-AFF3-F1AF9938A97F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -44,6 +46,10 @@ Global
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBFBE639-A532-408A-960D-288E05FEEB0E}.Release|Any CPU.Build.0 = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68361F37-56E9-4B49-AFF3-F1AF9938A97F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp4</RootNamespace>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2036
# Visual Studio Version 16
VisualStudioVersion = 16.0.29503.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAppVb", "WindowsAppVb\WindowsAppVb.csproj", "{63AE39F6-D4CF-0888-2B6F-3EF803778218}"
EndProject
Expand All @@ -16,7 +16,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmptyVb", "EmptyVb\EmptyVb.csproj", "{913DD733-37BF-05CF-35C5-5BD4A0431C47}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.csproj", "{49DF6752-696A-0F7B-1455-E2F06769DFAE}"
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VbNetStandardLib", "VbNetStandardLib\VbNetStandardLib.csproj", "{49DF6752-696A-0F7B-1455-E2F06769DFAE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp4", "ConsoleApp4\ConsoleApp4.csproj", "{DA129E5C-9AB1-04B8-2DAB-3BD1FBAF9DDF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -44,6 +46,10 @@ Global
{49DF6752-696A-0F7B-1455-E2F06769DFAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49DF6752-696A-0F7B-1455-E2F06769DFAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49DF6752-696A-0F7B-1455-E2F06769DFAE}.Release|Any CPU.Build.0 = Release|Any CPU
{DA129E5C-9AB1-04B8-2DAB-3BD1FBAF9DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DA129E5C-9AB1-04B8-2DAB-3BD1FBAF9DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA129E5C-9AB1-04B8-2DAB-3BD1FBAF9DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DA129E5C-9AB1-04B8-2DAB-3BD1FBAF9DDF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>ConsoleApp4</RootNamespace>
<TargetFramework>netcoreapp3.0</TargetFramework>
<DefaultItemExcludes>$(DefaultItemExcludes);$(ProjectDir)**\*.vb</DefaultItemExcludes>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace ConsoleApp4.A
{
public class Dictionary<V, K> : System.Collections.Generic.Dictionary<K, V>
{
public Dictionary()
{
}
}
}
Loading

0 comments on commit 0904218

Please sign in to comment.