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); }
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()); }
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()); }
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); }
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); }
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; } } }
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; } } }
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); }
protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession) { // nothing, implement SQM if needed }
protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession) { sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.Interactive); }
protected override void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession) { sqm.SetDatapoint(sqmSession, SqmServiceProvider.DATAID_SQM_ROSLYN_COMPILERTYPE, (uint)SqmServiceProvider.CompilerType.Interactive); }
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); } } } }
protected abstract void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession);
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); }
public static void LogSession(IVsSqmMulti session, bool isMicrosoftInternal) { SetVSSessionGuid(session); ReportVSSessionSQM(session, isMicrosoftInternal); }
protected abstract void CompilerSpecificSqm(IVsSqmMulti sqm, uint sqmSession);
private static extern void QueryService(ref Guid rsid, ref Guid riid, out IVsSqmMulti vssqm);
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); } } } }
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(); }
public static void LogSession(IVsSqmMulti session, bool isMicrosoftInternal) { SetVSSessionGuid(session); ReportVSSessionSQM(session, isMicrosoftInternal); }