Beispiel #1
0
        private static void LogNumericBuildNumber(IVsSqmMulti session, uint sessionHandle, uint datapoint, string build)
        {
            uint numericBuild = 0;

            uint.TryParse(build.Split('.').Join(""), out numericBuild);
            session.SetDatapoint(sessionHandle, datapoint, numericBuild);
        }
Beispiel #2
0
        protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
        {
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.CompilerServer);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_LANGUAGEVERSION, (uint)Arguments.ParseOptions.LanguageVersion);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGLEVEL, (uint)Arguments.CompilationOptions.WarningLevel);

            //Project complexity # of source files, # of references
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_SOURCES, (uint)Arguments.SourceFiles.Count());
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_REFERENCES, (uint)Arguments.ReferencePaths.Count());
        }
Beispiel #3
0
        protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
        {
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.Compiler);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_LANGUAGEVERSION, (uint)Arguments.ParseOptions.LanguageVersion);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGLEVEL, (uint)Arguments.CompilationOptions.WarningLevel);

            //Project complexity # of source files, # of references
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_SOURCES, (uint)Arguments.SourceFiles.Count());
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_REFERENCES, (uint)Arguments.ReferencePaths.Count());
        }
        protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
        {
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.CompilerServer);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGLEVEL, (uint)Arguments.CompilationOptions.WarningLevel);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_LANGUAGEVERSION, (uint)Arguments.ParseOptions.LanguageVersion);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGLEVEL, Arguments.CompilationOptions.GeneralDiagnosticOption == ReportDiagnostic.Suppress ? 1u : 0u);
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_EMBEDVBCORE, Arguments.CompilationOptions.EmbedVbCoreRuntime ? 1u : 0u);

            //Project complexity # of source files, # of references
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_SOURCES, (uint)Arguments.SourceFiles.Count());
            sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_REFERENCES, (uint)Arguments.ReferencePaths.Count());
        }
Beispiel #5
0
        public static IVsSqmMulti TryGetSqmService()
        {
            IVsSqmMulti result = null;
            Guid        rsid   = new Guid("2508FDF0-EF80-4366-878E-C9F024B8D981");
            Guid        riid   = new Guid("B17A7D4A-C1A3-45A2-B916-826C3ABA067E");

            try
            {
                QueryService(ref rsid, ref riid, out result);
            }
            catch (Exception e)
            {
                Debug.Assert(false, string.Format("Could not get SQM service or have SQM related errors: {0}", e.ToString()));
                return(null);
            }
            return(result);
        }
Beispiel #6
0
        private static void ReportVSSessionSQM(IVsSqmMulti session, bool isMicrosoftInternal)
        {
            var multiSession = session;
            var vsBuild = Process.GetCurrentProcess().MainModule.FileVersionInfo.ProductVersion;
            var roslynBuild = FileVersionInfo.GetVersionInfo(typeof(Sqm).Assembly.Location).FileVersion;

            uint sessionHandle;
            multiSession.BeginSession(CS_VB_Language_Services, AlwaysSendTelemetryEvenIfUserIsOptedOut, out sessionHandle);

            // Log some common datapoints useful in all cubes
            multiSession.SetStringDatapoint(sessionHandle, DATAID_SQM_STARTUPAPPBUILDNUMBERSTRING, vsBuild);
            LogNumericBuildNumber(multiSession, sessionHandle, DATAID_SQM_STARTUPAPPBUILDNUMBER, vsBuild);

            multiSession.SetStringDatapoint(sessionHandle, DATAID_DP_PRIVATEDOGFOODBUILDNUMBER, roslynBuild);
            LogNumericBuildNumber(multiSession, sessionHandle, DATAID_DP_PRIVATEBUILDNUMBER, roslynBuild);

            multiSession.SetDatapoint(sessionHandle, DATAID_SQM_USERTYPE, isMicrosoftInternal ? 1u : 0);

            multiSession.EndSession(sessionHandle);
        }
Beispiel #7
0
        private static void SetVSSessionGuid(IVsSqmMulti session)
        {
            // Set the VSSessionGuid so our out-of-proc compiler builds can record sqm data
            if (!(System.Threading.Interlocked.CompareExchange(ref s_sqmGuidSet, 1, 0) == 1))
            {
                try
                {
                    var globalSessionGuid = session.GetGlobalSessionGuid();

                    // make sure we disable marking global project collection dirty before setting this global property
                    // otherwise, it will cause full property re-evaluation after this point since project system thinks something related
                    // to projects has changed.
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.DisableMarkDirty = true;
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.SetGlobalProperty("VSSessionGuid", globalSessionGuid.ToString());
                }
                finally
                {
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.DisableMarkDirty = false;
                }
            }
        }
Beispiel #8
0
        private static void SetVSSessionGuid(IVsSqmMulti session)
        {
            // Set the VSSessionGuid so our out-of-proc compiler builds can record sqm data
            if (!(System.Threading.Interlocked.CompareExchange(ref s_sqmGuidSet, 1, 0) == 1))
            {
                try
                {
                    var globalSessionGuid = session.GetGlobalSessionGuid();

                    // make sure we disable marking global project collection dirty before setting this global property
                    // otherwise, it will cause full property re-evaluation after this point since project system thinks something related
                    // to projects has changed.
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.DisableMarkDirty = true;
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.SetGlobalProperty("VSSessionGuid", globalSessionGuid.ToString());
                }
                finally
                {
                    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.DisableMarkDirty = false;
                }
            }
        }
Beispiel #9
0
        private static void ReportVSSessionSQM(IVsSqmMulti session, bool isMicrosoftInternal)
        {
            var multiSession = session;
            var vsBuild      = Process.GetCurrentProcess().MainModule.FileVersionInfo.ProductVersion;
            var roslynBuild  = FileVersionInfo.GetVersionInfo(typeof(Sqm).Assembly.Location).FileVersion;

            uint sessionHandle;

            multiSession.BeginSession(CS_VB_Language_Services, AlwaysSendTelemetryEvenIfUserIsOptedOut, out sessionHandle);

            // Log some common datapoints useful in all cubes
            multiSession.SetStringDatapoint(sessionHandle, DATAID_SQM_STARTUPAPPBUILDNUMBERSTRING, vsBuild);
            LogNumericBuildNumber(multiSession, sessionHandle, DATAID_SQM_STARTUPAPPBUILDNUMBER, vsBuild);

            multiSession.SetStringDatapoint(sessionHandle, DATAID_DP_PRIVATEDOGFOODBUILDNUMBER, roslynBuild);
            LogNumericBuildNumber(multiSession, sessionHandle, DATAID_DP_PRIVATEBUILDNUMBER, roslynBuild);

            multiSession.SetDatapoint(sessionHandle, DATAID_SQM_USERTYPE, isMicrosoftInternal ? 1u : 0);

            multiSession.EndSession(sessionHandle);
        }
Beispiel #10
0
 protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
 {
     // nothing, implement SQM if needed
 }
Beispiel #11
0
 protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
 {
     sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.Interactive);
 }
Beispiel #12
0
 protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
 {
     sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.Interactive);
 }
Beispiel #13
0
        private void GenerateSqmData(CompilationOptions compilationOptions, ImmutableArray <Diagnostic> diagnostics)
        {
            // Generate SQM data file for Compilers
            if (Arguments.SqmSessionGuid != Guid.Empty)
            {
                IVsSqmMulti sqm        = null;
                uint        sqmSession = 0u;
                try
                {
                    sqm = SqmServiceProvider.TryGetSqmService();
                    if (sqm != null)
                    {
                        sqm.BeginSession(this.GetSqmAppID(), false, out sqmSession);
#if !BOOTSTRAP
                        sqm.SetGlobalSessionGuid(Arguments.SqmSessionGuid);
#endif
                        // Build Version
                        Assembly thisAssembly = typeof(CommonCompiler).Assembly;
                        var      fileVersion  = FileVersionInfo.GetVersionInfo(thisAssembly.Location).FileVersion;
                        sqm.SetStringDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_BUILDVERSION, fileVersion);

                        // Write Errors and Warnings from build
                        foreach (var diagnostic in diagnostics)
                        {
                            switch (diagnostic.Severity)
                            {
                            case DiagnosticSeverity.Error:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_ERRORNUMBERS, (uint)diagnostic.Code);
                                break;

                            case DiagnosticSeverity.Warning:
                                if (diagnostic.IsWarningAsError)
                                {
                                    sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_ERRORNUMBERS, (uint)diagnostic.Code);
                                }
                                else
                                {
                                    sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGNUMBERS, (uint)diagnostic.Code);
                                }
                                break;

                            case DiagnosticSeverity.None:
                            case DiagnosticSeverity.Info:
                                break;

                            default:
                                throw ExceptionUtilities.UnexpectedValue(diagnostic.Severity);
                            }
                        }

                        //Suppress Warnings / warningCode as error / warningCode as warning
                        foreach (var item in compilationOptions.SpecificDiagnosticOptions)
                        {
                            uint             code    = uint.Parse(item.Key.Substring(2));
                            ReportDiagnostic options = item.Value;
                            switch (options)
                            {
                            case ReportDiagnostic.Suppress:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_SUPPRESSWARNINGNUMBERS, code);      // Supress warning
                                break;

                            case ReportDiagnostic.Error:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNASERRORS_NUMBERS, code);       // Warning as errors
                                break;

                            case ReportDiagnostic.Warn:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNASWARNINGS_NUMBERS, code);     // Warning as warnings
                                break;

                            default:
                                break;
                            }
                        }
                        sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_OUTPUTKIND, (uint)compilationOptions.OutputKind);
                        CompilerSpecificSqm(sqm, sqmSession);
                    }
                }
                finally
                {
                    if (sqm != null)
                    {
                        sqm.EndSession(sqmSession);
                    }
                }
            }
        }
Beispiel #14
0
 protected abstract void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession);
Beispiel #15
0
 private static void LogNumericBuildNumber(IVsSqmMulti session, uint sessionHandle, uint datapoint, string build)
 {
     uint numericBuild = 0;
     uint.TryParse(build.Split('.').Join(""), out numericBuild);
     session.SetDatapoint(sessionHandle, datapoint, numericBuild);
 }
Beispiel #16
0
 public static void LogSession(IVsSqmMulti session, bool isMicrosoftInternal)
 {
     SetVSSessionGuid(session);
     ReportVSSessionSQM(session, isMicrosoftInternal);
 }
 protected abstract void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession);
Beispiel #18
0
 private static extern void QueryService(ref Guid rsid, ref Guid riid, out IVsSqmMulti vssqm);
Beispiel #19
0
        private void GenerateSqmData(CompilationOptions compilationOptions, ImmutableArray <Diagnostic> diagnostics)
        {
            // Generate SQM data file for Compilers
            if (Arguments.SqmSessionGuid != Guid.Empty)
            {
                IVsSqmMulti sqm        = null;
                uint        sqmSession = 0u;
                try
                {
                    sqm = SqmServiceProvider.TryGetSqmService(_clientDirectory);
                    if (sqm != null)
                    {
                        sqm.BeginSession(this.GetSqmAppID(), false, out sqmSession);
                        sqm.SetGlobalSessionGuid(Arguments.SqmSessionGuid);

                        // Build Version
                        sqm.SetStringDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_BUILDVERSION, GetAssemblyFileVersion());

                        // Write Errors and Warnings from build
                        foreach (var diagnostic in diagnostics)
                        {
                            switch (diagnostic.Severity)
                            {
                            case DiagnosticSeverity.Error:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_ERRORNUMBERS, (uint)diagnostic.Code);
                                break;

                            case DiagnosticSeverity.Warning:
                                sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNINGNUMBERS, (uint)diagnostic.Code);
                                break;

                            case DiagnosticSeverity.Hidden:
                            case DiagnosticSeverity.Info:
                                break;

                            default:
                                throw ExceptionUtilities.UnexpectedValue(diagnostic.Severity);
                            }
                        }

                        //Suppress Warnings / warningCode as error / warningCode as warning
                        foreach (var item in compilationOptions.SpecificDiagnosticOptions)
                        {
                            uint code;
                            if (TryGetCompilerDiagnosticCode(item.Key, out code))
                            {
                                ReportDiagnostic options = item.Value;
                                switch (options)
                                {
                                case ReportDiagnostic.Suppress:
                                    sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_SUPPRESSWARNINGNUMBERS, code);          // Suppress warning
                                    break;

                                case ReportDiagnostic.Error:
                                    sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNASERRORS_NUMBERS, code);           // Warning as errors
                                    break;

                                case ReportDiagnostic.Warn:
                                    sqm.AddItemToStream(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_WARNASWARNINGS_NUMBERS, code);         // Warning as warnings
                                    break;

                                default:
                                    break;
                                }
                            }
                        }
                        sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_OUTPUTKIND, (uint)compilationOptions.OutputKind);
                        CompilerSpecificSqm(sqm, sqmSession);
                    }
                }
                finally
                {
                    if (sqm != null)
                    {
                        sqm.EndSession(sqmSession);
                    }
                }
            }
        }
Beispiel #20
0
 private static extern void QueryService(ref Guid rsid, ref Guid riid, out IVsSqmMulti vssqm);
 protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession)
 {
     throw new NotImplementedException();
 }
Beispiel #22
0
 public static void LogSession(IVsSqmMulti session, bool isMicrosoftInternal)
 {
     SetVSSessionGuid(session);
     ReportVSSessionSQM(session, isMicrosoftInternal);
 }