﻿// 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.

#nullable disable

// <auto-generated/>

using System;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell.Interop;

namespace Microsoft.VisualStudio.LanguageServices.CSharp.ProjectSystemShim.Interop
{
    [ComImport]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid(Guids.CSharpProjectRootIdString)]
    internal interface ICSharpProjectRoot
    {
        // Sets the site for this project object.
        void SetProjectSite(ICSharpProjectSite site);

        // Get the site object for this project (any interface; IID_ICSharpProjectSite is
        // guaranteed)
        [return: MarshalAs(UnmanagedType.IUnknown)]
        object GetProjectSite([In] ref Guid riid);

        // Returns the path containing the project file.
        [return: MarshalAs(UnmanagedType.BStr)]
        string GetProjectLocation();

        // Returns the full path name of the project file, or some other entity which is guaranteed
        // to be unique across all open projects.
        [return: MarshalAs(UnmanagedType.BStr)]
        string GetFullProjectName();

        // Determines whether the given file is contained in this project
        [PreserveSig]
        int BelongsToProject([MarshalAs(UnmanagedType.LPWStr)] string pszFileName);

        // Returns the name of the active configuration
        [return: MarshalAs(UnmanagedType.BStr)]
        string GetActiveConfigurationName();

        // Constructs a suitable name for a per-project per-configuration cache file
        [return: MarshalAs(UnmanagedType.BStr)]
        string BuildPerConfigCacheFileName();

        // Configure the given compiler and input set objects based on all current
        // settings of the project, including configuration (debug/retail/goo, etc.)
        void ConfigureCompiler(
            [MarshalAs(UnmanagedType.Interface)] ICSCompiler compiler,
            [MarshalAs(UnmanagedType.Interface)] ICSInputSet inputSet,
            bool addSources);

        // Determines whether the project can create a file code model object for the given file
        bool CanCreateFileCodeModel([MarshalAs(UnmanagedType.LPWStr)] string pszFile);

        // Create a file code model object for the given file
        [return: MarshalAs(UnmanagedType.IUnknown)]
        object CreateFileCodeModel([MarshalAs(UnmanagedType.LPWStr)] string pszFile, [In] ref Guid riid);

        // Get the VS hierarchy/item ID for the given file
        [PreserveSig]
        int GetHierarchyAndItemID(
            [MarshalAs(UnmanagedType.LPWStr)] string pszFile,
            [MarshalAs(UnmanagedType.Interface)] out IVsHierarchy ppHier,
            out uint pItemID);

        // Get the VS hierarchy/item ID for the given file, optionally for files that are not in
        // project
        void GetHierarchyAndItemIDOptionallyInProject(
            [MarshalAs(UnmanagedType.LPWStr)] string pszFile,
            [MarshalAs(UnmanagedType.Interface)] out IVsHierarchy ppHier,
            out uint pItemID,
            bool mustBeInProject);
    }
}
