File: CommandLine\VisualBasicCommandLineArguments.vb
Web Access
Project: src\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic)
' 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 System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Diagnostics
Imports System.IO
Imports System.Linq
Imports System.Runtime.InteropServices
Imports System.Text
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Utilities
Imports TypeKind = Microsoft.CodeAnalysis.TypeKind
 
Namespace Microsoft.CodeAnalysis.VisualBasic
    ''' <summary>
    ''' The CommandLineArguments class provides members to Set and Get Visual Basic compilation and parse options.
    ''' </summary>
    Public NotInheritable Class VisualBasicCommandLineArguments
        Inherits CommandLineArguments
        ''' <summary>
        ''' Set and Get the Visual Basic compilation options.
        ''' </summary>
        ''' <returns>The currently set Visual Basic compilation options.</returns>
        Public Overloads Property CompilationOptions As VisualBasicCompilationOptions
 
        ''' <summary>
        ''' Set and Get the Visual Basic parse options.
        ''' </summary>
        ''' <returns>The currently set Visual Basic parse options.</returns>
        Public Overloads Property ParseOptions As VisualBasicParseOptions
 
        Friend OutputLevel As OutputLevel
 
        ''' <summary>
        ''' Gets the core Parse options.
        ''' </summary>
        ''' <returns>The currently set core parse options.</returns>
        Protected Overrides ReadOnly Property ParseOptionsCore As ParseOptions
            Get
                Return ParseOptions
            End Get
        End Property
 
        ''' <summary>
        ''' Gets the core compilation options.
        ''' </summary>
        ''' <returns>The currently set core compilation options.</returns>
        Protected Overrides ReadOnly Property CompilationOptionsCore As CompilationOptions
            Get
                Return CompilationOptions
            End Get
        End Property
 
        Friend Property DefaultCoreLibraryReference As CommandLineReference?
 
        Friend Sub New()
        End Sub
 
        Friend Overrides Function ResolveMetadataReferences(
            metadataResolver As MetadataReferenceResolver,
            diagnostics As List(Of DiagnosticInfo),
            messageProvider As CommonMessageProvider,
            resolved As List(Of MetadataReference)
            ) As Boolean
 
            Dim result = MyBase.ResolveMetadataReferences(metadataResolver, diagnostics, messageProvider, resolved)
 
            ' If there were no references, don't try to add default Cor library reference.
            If Me.DefaultCoreLibraryReference IsNot Nothing AndAlso resolved.Count > 0 Then
                ' All references from arguments were resolved successfully. Let's see if we have a reference that can be used as a Cor library.
                For Each reference In resolved
                    If reference.IsUnresolved Then
                        Continue For
                    End If
 
                    Dim refProps = reference.Properties
 
                    ' The logic about deciding what assembly is a candidate for being a Cor library here and in
                    ' CommonReferenceManager<TCompilation, TAssemblySymbol>.IndexOfCorLibrary
                    ' should be equivalent.
                    If Not refProps.EmbedInteropTypes AndAlso refProps.Kind = MetadataImageKind.Assembly Then
                        Try
                            Dim assemblyMetadata = TryCast(DirectCast(reference, PortableExecutableReference).GetMetadataNoCopy(), AssemblyMetadata)
 
                            If assemblyMetadata Is Nothing OrElse Not assemblyMetadata.IsValidAssembly() Then
                                ' There will be some errors reported later.
                                Return result
                            End If
 
                            Dim assembly As PEAssembly = assemblyMetadata.GetAssembly()
 
                            If assembly.AssemblyReferences.Length = 0 AndAlso Not assembly.ContainsNoPiaLocalTypes AndAlso assembly.DeclaresTheObjectClass Then
                                ' This reference looks like a valid Cor library candidate, bail out.
                                Return result
                            End If
 
                        Catch e As BadImageFormatException
                            ' error reported later
                            Return result
                        Catch e As IOException
                            ' error reported later
                            Return result
                        End Try
                    End If
                Next
 
                ' None of the supplied references could be used as a Cor library. Let's add a default one.
                Dim defaultCorLibrary = ResolveMetadataReference(Me.DefaultCoreLibraryReference.Value, metadataResolver, diagnostics, messageProvider).FirstOrDefault()
 
                If defaultCorLibrary Is Nothing OrElse defaultCorLibrary.IsUnresolved Then
                    Debug.Assert(diagnostics Is Nothing OrElse diagnostics.Any())
                    Return False
                Else
                    resolved.Insert(0, defaultCorLibrary)
                    Return result
                End If
            End If
 
            Return result
        End Function
 
    End Class
 
    Friend Enum OutputLevel
        Quiet
        Normal
        Verbose
    End Enum
 
End Namespace