33using System . IO ;
44using System . Linq ;
55using System . Xml ;
6- using Semmle . Util . Logging ;
76
87namespace Semmle . Autobuild . Shared
98{
@@ -26,6 +25,26 @@ public class Project<TAutobuildOptions> : ProjectOrSolution<TAutobuildOptions> w
2625 private readonly Lazy < List < Project < TAutobuildOptions > > > includedProjectsLazy ;
2726 public override IEnumerable < IProjectOrSolution > IncludedProjects => includedProjectsLazy . Value ;
2827
28+ private static bool HasSdkAttribute ( XmlElement xml ) =>
29+ xml . HasAttribute ( "Sdk" ) ;
30+
31+ private static bool AnyElement ( XmlNodeList l , Func < XmlElement , bool > f ) =>
32+ l . OfType < XmlElement > ( ) . Any ( f ) ;
33+
34+ /// <summary>
35+ /// According to https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-use-project-sdk?view=vs-2022#reference-a-project-sdk
36+ /// there are three ways to reference a project SDK:
37+ /// 1. As an attribute on the <Project/>.
38+ /// 2. As a top level element of <Project>.
39+ /// 3. As an attribute on an <Import> element.
40+ ///
41+ /// Returns true, if the Sdk attribute is used, otherwise false.
42+ /// </summary>
43+ private static bool ReferencesSdk ( XmlElement xml ) =>
44+ HasSdkAttribute ( xml ) || // Case 1
45+ AnyElement ( xml . ChildNodes , e => e . Name == "Sdk" ) || // Case 2
46+ AnyElement ( xml . GetElementsByTagName ( "Import" ) , HasSdkAttribute ) ; // Case 3
47+
2948 public Project ( Autobuilder < TAutobuildOptions > builder , string path ) : base ( builder , path )
3049 {
3150 ToolsVersion = new Version ( ) ;
@@ -49,7 +68,7 @@ public Project(Autobuilder<TAutobuildOptions> builder, string path) : base(build
4968
5069 if ( root ? . Name == "Project" )
5170 {
52- if ( root . HasAttribute ( "Sdk" ) )
71+ if ( ReferencesSdk ( root ) )
5372 {
5473 DotNetProject = true ;
5574 return ;
0 commit comments