' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.

Imports Basic.Reference.Assemblies
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Roslyn.Test.Utilities

Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit

    Public Class EmitCustomModifiers
        Inherits BasicTestBase

        <Fact>
        Public Sub Test1()
            Dim mscorlibRef = Net40.References.mscorlib

            Dim source As String = <text> 
Public Class A

    Public Shared Sub Main()
    
        Modifiers.F1(1)
        Modifiers.F2(1)
        Modifiers.F3(1)

        System.Console.WriteLine(Modifiers.F7())
        Modifiers.F8()
        Modifiers.F9()

        C4.M4()
    End Sub
End Class
</text>.Value

            Dim c1 = VisualBasicCompilation.Create("VB_EmitCustomModifiers",
                                        {Parse(source)},
                                        {mscorlibRef, TestReferences.SymbolsTests.CustomModifiers.Modifiers.dll})

            CompileAndVerify(c1, expectedOutput:=<![CDATA[
F1
F2
F3
F7
F8
F9
M4
]]>)
        End Sub

        <Fact>
        <WorkItem(737971, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/737971")>
        Public Sub ByRefBeforeCustomModifiers()
            Dim il = <![CDATA[
.class public auto ansi beforefieldinit C
       extends [mscorlib]System.Object
{
  // Increments argument
  .method public hidebysig static void Incr(uint32 modopt([mscorlib]System.Runtime.CompilerServices.IsLong) & a) cil managed
  {
    ldarg.0
    dup
    ldind.u4
    ldc.i4.1
    add
    stind.i4
    ret
  } // end of method Test::M

  .method public hidebysig specialname rtspecialname
          instance void  .ctor() cil managed
  {
    ldarg.0
    call       instance void [mscorlib]System.Object::.ctor()
    ret
  }
} // end of class D
]]>

            Dim source =
                <compilation>
                    <file>
Class Test
    Shared Sub Main() 
        Dim u As UInteger = 1
        C.Incr(u)
        System.Console.WriteLine(u)
    End Sub
End Class
    </file>
                </compilation>

            Dim comp = CreateCompilationWithCustomILSource(source, il.Value, TestOptions.ReleaseExe)

            Dim [type] = comp.GlobalNamespace.GetMember(Of NamedTypeSymbol)("C")
            Dim method = type.GetMember(Of MethodSymbol)("Incr")
            Dim parameter = method.Parameters.Single()

            Assert.True(parameter.IsByRef)
            Assert.False(parameter.CustomModifiers.IsEmpty)
            Assert.True(parameter.RefCustomModifiers.IsEmpty)

            CompileAndVerify(comp, expectedOutput:=<![CDATA[2]]>)
        End Sub
    End Class
End Namespace
