From 4748922b33d7ac36bc1987f92b677f40f00bafea Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Fri, 30 Jun 2017 15:42:16 -0700 Subject: [PATCH] Implemented vb conversionkind support. --- .../Operations/VisualBasicOperationFactory.vb | 2 +- .../VisualBasicOperationFactory_Methods.vb | 22 +++++ .../IOperationTests_IConversionExpression.vb | 93 ++++++++++++------- .../IOperationTests_InvalidExpression.vb | 2 +- 4 files changed, 83 insertions(+), 36 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb index 2078f332a5b..112662eb8c5 100644 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb +++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb @@ -432,7 +432,7 @@ Namespace Microsoft.CodeAnalysis.Semantics Private Function CreateBoundConversionOperation(boundConversion As BoundConversion) As IConversionExpression Dim operand As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundConversion.Operand)) - Dim conversionKind As ConversionKind = Semantics.ConversionKind.Basic + Dim conversionKind As ConversionKind = GetConversionKind(boundConversion.ConversionKind) Dim isExplicit As Boolean = boundConversion.ExplicitCastInCode Dim usesOperatorMethod As Boolean = False Dim operatorMethod As IMethodSymbol = Nothing diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory_Methods.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory_Methods.vb index 2fc4b25e17d..3c3445b8200 100644 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory_Methods.vb +++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory_Methods.vb @@ -439,6 +439,28 @@ Namespace Microsoft.CodeAnalysis.Semantics [event], instance, Create(statement.Handler), adds:=False, isInvalid:=statement.HasErrors, syntax:=statement.Syntax, type:=Nothing, constantValue:=Nothing) End Function + Private Function GetConversionKind(kind As VisualBasic.ConversionKind) As Semantics.ConversionKind + Dim operationKind = Semantics.ConversionKind.Invalid + + If kind.HasFlag(VisualBasic.ConversionKind.UserDefined) Then + operationKind = Semantics.ConversionKind.OperatorMethod + ElseIf Conversions.IsIdentityConversion(kind) Or + kind.HasFlag(VisualBasic.ConversionKind.Reference) Or + kind.HasFlag(VisualBasic.ConversionKind.TypeParameter) Or + kind.HasFlag(VisualBasic.ConversionKind.Array) Or + kind.HasFlag(VisualBasic.ConversionKind.Value) Then + operationKind = Semantics.ConversionKind.Cast + ElseIf Conversions.NoConversion(kind) Then + operationKind = Semantics.ConversionKind.Invalid + ElseIf kind.HasFlag(VisualBasic.ConversionKind.InterpolatedString) Then + operationKind = Semantics.ConversionKind.InterpolatedString + Else + operationKind = Semantics.ConversionKind.Basic + End If + + Return operationKind + End Function + Friend Class Helper Friend Shared Function DeriveUnaryOperationKind(operatorKind As UnaryOperatorKind) As UnaryOperationKind Select Case operatorKind And UnaryOperatorKind.OpMask diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb index 12763637fca..23b8679a526 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb @@ -249,7 +249,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim a As A =') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'a') Variables: Local_1: a As Program.A - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.A, IsInvalid) (Syntax: '') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Program.A, IsInvalid) (Syntax: '') IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '') ]]>.Value @@ -277,7 +277,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim a As Integer = b + c') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'a') Variables: Local_1: a As System.Int32 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Int32, IsInvalid) (Syntax: 'b + c') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Int32, IsInvalid) (Syntax: 'b + c') IBinaryOperatorExpression (BinaryOperationKind.Invalid) (OperationKind.BinaryOperatorExpression, Type: ?, IsInvalid) (Syntax: 'b + c') Left: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'b') Right: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'c') @@ -487,7 +487,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1 As C1 = c2') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1') Variables: Local_1: c1 As Program.C1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.C1) (Syntax: 'c2') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.C1) (Syntax: 'c2') ILocalReferenceExpression: c2 (OperationKind.LocalReferenceExpression, Type: Program.C2) (Syntax: 'c2') ]]>.Value @@ -518,7 +518,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim c1 As C1 = c2') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'c1') Variables: Local_1: c1 As Program.C1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.C1, IsInvalid) (Syntax: 'c2') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Program.C1, IsInvalid) (Syntax: 'c2') ILocalReferenceExpression: c2 (OperationKind.LocalReferenceExpression, Type: Program.C2) (Syntax: 'c2') ]]>.Value @@ -554,7 +554,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1 As I1 = c1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1') Variables: Local_1: i1 As Program.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') ILocalReferenceExpression: c1 (OperationKind.LocalReferenceExpression, Type: Program.C1) (Syntax: 'c1') ]]>.Value @@ -585,7 +585,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1 As I1 = c1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1') Variables: Local_1: i1 As Program.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') ILocalReferenceExpression: c1 (OperationKind.LocalReferenceExpression, Type: Program.C1) (Syntax: 'c1') ]]>.Value @@ -619,7 +619,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1 As I1 = c1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1') Variables: Local_1: i1 As Program.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 'c1') ILocalReferenceExpression: c1 (OperationKind.LocalReferenceExpression, Type: Program.C1) (Syntax: 'c1') ]]>.Value @@ -647,7 +647,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim o As Object = i') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'o') Variables: Local_1: o As System.Object - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'i') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'i') ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: Program.I1) (Syntax: 'i') ]]>.Value @@ -680,7 +680,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1List ... 1) = i2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1List') Variables: Local_1: i1List As System.Collections.Generic.IEnumerable(Of Program.I1) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.I1)) (Syntax: 'i2List') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.I1)) (Syntax: 'i2List') ILocalReferenceExpression: i2List (OperationKind.LocalReferenceExpression, Type: System.Collections.Generic.IList(Of Program.I2)) (Syntax: 'i2List') ]]>.Value @@ -764,7 +764,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ac ... End Sub') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a') Variables: Local_1: a As System.Action - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: 'Sub(i As In ... End Sub') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: 'Sub(i As In ... End Sub') ILambdaExpression (Signature: Sub (i As System.Int32)) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Sub(i As In ... End Sub') IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Sub(i As In ... End Sub') ILabelStatement (Label: exit) (OperationKind.LabelStatement) (Syntax: 'End Sub') @@ -865,7 +865,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Fu ... End Sub') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a') Variables: Local_1: a As System.Func(Of System.Int32) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int32)) (Syntax: 'Sub()'BIND: ... End Sub') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int32)) (Syntax: 'Sub()'BIND: ... End Sub') ILambdaExpression (Signature: Sub ()) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Sub()'BIND: ... End Sub') IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Sub()'BIND: ... End Sub') ILabelStatement (Label: exit) (OperationKind.LabelStatement) (Syntax: 'End Sub') @@ -950,7 +950,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim a As Ac ... ddressOf M2') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'a') Variables: Local_1: a As System.Action - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf M2') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf M2') IOperation: (OperationKind.None) (Syntax: 'AddressOf M2') ]]>.Value @@ -1035,7 +1035,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim a As Fu ... ddressOf M2') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'a') Variables: Local_1: a As System.Func(Of System.Int64) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int64), IsInvalid) (Syntax: 'AddressOf M2') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int64), IsInvalid) (Syntax: 'AddressOf M2') IOperation: (OperationKind.None) (Syntax: 'AddressOf M2') ]]>.Value @@ -1067,7 +1067,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim a As Ac ... = AddressOf') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'a') Variables: Local_1: a As System.Action - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'AddressOf') IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'AddressOf') Children(1): IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '') ]]>.Value @@ -1096,7 +1096,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ar ... teger(1) {}') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a') Variables: Local_1: a As System.Array - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Integer(1) {}') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Integer(1) {}') IArrayCreationExpression (Element Type: System.Int32) (OperationKind.ArrayCreationExpression, Type: System.Int32()) (Syntax: 'New Integer(1) {}') Dimension Sizes(1): IBinaryOperatorExpression (BinaryOperationKind.IntegerAdd) (OperationKind.BinaryOperatorExpression, Type: System.Int32, Constant: 2) (Syntax: '1') Left: ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1') @@ -1125,7 +1125,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ar ... ger(1)() {}') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a') Variables: Local_1: a As System.Array - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Integer(1)() {}') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Integer(1)() {}') IArrayCreationExpression (Element Type: System.Int32()) (OperationKind.ArrayCreationExpression, Type: System.Int32()()) (Syntax: 'New Integer(1)() {}') Dimension Sizes(1): IBinaryOperatorExpression (BinaryOperationKind.IntegerAdd) (OperationKind.BinaryOperatorExpression, Type: System.Int32, Constant: 2) (Syntax: '1') Left: ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1') @@ -1154,7 +1154,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim a As Ar ... New Object') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'a') Variables: Local_1: a As System.Array - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Object') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Array) (Syntax: 'New Object') IObjectCreationExpression (Constructor: Sub System.Object..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Object) (Syntax: 'New Object') ]]>.Value @@ -1190,7 +1190,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1List ... () = c2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1List') Variables: Local_1: c1List As Program.C1() - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.C1()) (Syntax: 'c2List') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.C1()) (Syntax: 'c2List') ILocalReferenceExpression: c2List (OperationKind.LocalReferenceExpression, Type: Program.C2()) (Syntax: 'c2List') ]]>.Value @@ -1223,7 +1223,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim c1List ... () = c2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'c1List') Variables: Local_1: c1List As Program.C1() - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.C1(), IsInvalid) (Syntax: 'c2List') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Program.C1(), IsInvalid) (Syntax: 'c2List') ILocalReferenceExpression: c2List (OperationKind.LocalReferenceExpression, Type: Program.C2()()) (Syntax: 'c2List') ]]>.Value @@ -1259,7 +1259,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim c1List ... () = c2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'c1List') Variables: Local_1: c1List As Program.C1() - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.C1(), IsInvalid) (Syntax: 'c2List') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Program.C1(), IsInvalid) (Syntax: 'c2List') ILocalReferenceExpression: c2List (OperationKind.LocalReferenceExpression, Type: Program.C2()) (Syntax: 'c2List') ]]>.Value @@ -1296,7 +1296,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1List ... 1) = c2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1List') Variables: Local_1: c1List As System.Collections.Generic.IEnumerable(Of Program.C1) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.C1)) (Syntax: 'c2List') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.C1)) (Syntax: 'c2List') ILocalReferenceExpression: c2List (OperationKind.LocalReferenceExpression, Type: Program.C2()) (Syntax: 'c2List') ]]>.Value @@ -1307,7 +1307,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio End Sub - Public Sub ConversionExpression_Implicit_WideningArrayToSystemIEnumberable_InvalidNoConversion() + Public Sub ConversionExpression_Implicit_WideningArrayToSystemIEnumerable_InvalidNoConversion() Dim source = .Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1List ... 1) = c2List') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1List') Variables: Local_1: c1List As System.Collections.Generic.IEnumerable(Of Program.C1) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.C1)) (Syntax: 'c2List') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.Collections.Generic.IEnumerable(Of Program.C1)) (Syntax: 'c2List') ILocalReferenceExpression: c2List (OperationKind.LocalReferenceExpression, Type: Program.C2()) (Syntax: 'c2List') ]]>.Value @@ -1363,7 +1363,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1 As I1 = s1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1') Variables: Local_1: i1 As Program.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 's1') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program.I1) (Syntax: 's1') ILocalReferenceExpression: s1 (OperationKind.LocalReferenceExpression, Type: Program.S1) (Syntax: 's1') ]]>.Value @@ -1391,7 +1391,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim v1 As ValueType = s1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'v1') Variables: Local_1: v1 As System.ValueType - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.ValueType) (Syntax: 's1') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: System.ValueType) (Syntax: 's1') ILocalReferenceExpression: s1 (OperationKind.LocalReferenceExpression, Type: Program.S1) (Syntax: 's1') ]]>.Value @@ -1422,7 +1422,7 @@ End Module]]>.Value IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim i1 As I1 = s1') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'i1') Variables: Local_1: i1 As Program.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Program.I1, IsInvalid) (Syntax: 's1') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Program.I1, IsInvalid) (Syntax: 's1') ILocalReferenceExpression: s1 (OperationKind.LocalReferenceExpression, Type: Program.S1) (Syntax: 's1') ]]>.Value @@ -1619,7 +1619,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1 As C1 = c3') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1') Variables: Local_1: c1 As Module1.C1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1) (Syntax: 'c3') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1) (Syntax: 'c3') ILocalReferenceExpression: c3 (OperationKind.LocalReferenceExpression, Type: Module1.C3) (Syntax: 'c3') ]]>.Value @@ -1653,7 +1653,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim c1 As C1 = New T') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'c1') Variables: Local_1: c1 As Module1.C1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1) (Syntax: 'New T') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1) (Syntax: 'New T') ITypeParameterObjectCreationExpression (OperationKind.TypeParameterObjectCreationExpression, Type: T) (Syntax: 'New T') ]]>.Value @@ -1687,7 +1687,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim c1 As C1 = New T') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'c1') Variables: Local_1: c1 As Module1.C1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1, IsInvalid) (Syntax: 'New T') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: Module1.C1, IsInvalid) (Syntax: 'New T') ITypeParameterObjectCreationExpression (OperationKind.TypeParameterObjectCreationExpression, Type: T) (Syntax: 'New T') ]]>.Value @@ -1725,7 +1725,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim i1 As I1 = New T') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'i1') Variables: Local_1: i1 As Module1.I1 - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: Module1.I1) (Syntax: 'New T') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Module1.I1) (Syntax: 'New T') ITypeParameterObjectCreationExpression (OperationKind.TypeParameterObjectCreationExpression, Type: T) (Syntax: 'New T') ]]>.Value @@ -1752,7 +1752,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'Dim t1 As T = New U') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 't1') Variables: Local_1: t1 As T - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: T) (Syntax: 'New U') + Initializer: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: T) (Syntax: 'New U') ITypeParameterObjectCreationExpression (OperationKind.TypeParameterObjectCreationExpression, Type: U) (Syntax: 'New U') ]]>.Value @@ -1779,7 +1779,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim t1 As T = New U') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 't1') Variables: Local_1: t1 As T - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: T, IsInvalid) (Syntax: 'New U') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: T, IsInvalid) (Syntax: 'New U') ITypeParameterObjectCreationExpression (OperationKind.TypeParameterObjectCreationExpression, Type: U) (Syntax: 'New U') ]]>.Value @@ -1870,7 +1870,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Const s As SByte = i') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 's') Variables: Local_1: s As System.SByte - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.SByte, IsInvalid) (Syntax: 'i') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.SByte, IsInvalid) (Syntax: 'i') ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32, Constant: 10000) (Syntax: 'i') ]]>.Value @@ -1981,7 +1981,7 @@ End Module IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'Dim expr As ... on(num) num') IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'expr') Variables: Local_1: expr As System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean)) - Initializer: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean)), IsInvalid) (Syntax: 'Function(num) num') + Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean)), IsInvalid) (Syntax: 'Function(num) num') ILambdaExpression (Signature: Function (num As System.Int32) As System.Boolean) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Function(num) num') IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function(num) num') Locals: Local_1: As System.Boolean @@ -2057,6 +2057,31 @@ BC30512: Option Strict On disallows implicit conversions from 'Integer' to 'SByt additionalOperationTreeVerifier:=AddressOf New ExpectedSymbolVerifier().Verify) End Sub + + Public Sub ConversionExpression_Implicit_WideningInterpolatedStringToIFormattable() + Dim source = .Value + + Dim expectedOperationTree = .Value + + Dim expectedDiagnostics = String.Empty + + VerifyOperationTreeAndDiagnosticsForTest(Of LocalDeclarationStatementSyntax)(source, expectedOperationTree, expectedDiagnostics) + End Sub + #End Region Private Class ExpectedSymbolVerifier diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb index 6bf6dc10219..56ba1856d79 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb @@ -134,7 +134,7 @@ Class Program End Class]]>.Value Dim expectedOperationTree = .Value -- GitLab