2013-07-10 4 views
1

У меня есть небольшая проблема при выполнении запроса CQLinq.NDepend маленькой проблема проверка имени устаревшего метода

Я пытаюсь получить метод, который устарел с заданным fullnames, что означает, что я хочу, чтобы конкретно указать, какие методы являются устаревшими по FullName.

Результат должен выскочить 5 матчей, что означает метод CallME(), который является устаревшим, должны быть включены:

enter image description here

Однако CallME() не включается, когда я делаю этот запрос!

// <Name>Don't use obsolete types, methods or fields</Name> 
warnif count > 0 
let oConcreteM = new String[] {"usageAssembly.Class1.callMe()"} 

let obsoleteTypes = Types.Where(t => t.IsObsolete) 
let obsoleteMethods = Methods.Where(m => m.IsObsolete 
&& oConcreteM.Contains(m.FullName)).ToHashSet() //TODO HERE!! (Specify callMe()) 



from m in JustMyCode.Methods.UsingAny(obsoleteTypes).Union(
     JustMyCode.Methods.UsingAny(obsoleteMethods)).Union(
     JustMyCode.Methods.UsingAny(obsoleteFields)) 

let obsoleteTypesUsed = obsoleteTypes.UsedBy(m) 

// Optimization: MethodsCalled + Intersect() is faster than using obsoleteMethods.UsedBy() 
let obsoleteMethodsUsed = m.MethodsCalled.Intersect(obsoleteMethods) 
let obsoleteFieldsUsed = obsoleteFields.UsedBy(m) 
select new { m,obsoleteTypesUsed, obsoleteMethodsUsed, obsoleteFieldsUsed } 

С выше запроса, CallME() нет, но, чтобы получить 5 матчей, мы должны удалить «& & oConcreteM.Contains (m.FullName)» код, но я не хочу, что Я хочу проверить, совпадает ли имя в методе Полное имя в oConcreteM. Вот что выход дает мне:

enter image description here

Я надеюсь, что вы, ребята, там может помочь мне :)

ответ

1

Так, чтобы ответить на то, что должен был вопрос:

Я хочу перечислить методы, определенные в списке строк (определяющих полные имена), которые устарели + для каждого согласованного метода, перечислить используемые устаревшие типы/методы/поля

let methods= Application.Methods.WithFullNameIn(
         "Namespace1.Class1.Method1()", 
         "Namespace2.Class2.Method2()") // Put more full names here 
         .Where(m => m.IsObsolete) 

from m in methods 
// Here we cannot easily define m.TypesUsed, hence we use an astute 
let obsoleteTypesUsed = m.ParentType.TypesUsed.Where(t => t.IsObsolete).Where(t => t.IsUsedBy(m)) 
let obsoleteMethodsUsed = m.MethodsCalled.Where(m1 => m1.IsObsolete) 
let obsoleteFielsUsed = m.FieldsUsed.Where(f => f.IsObsolete) 
select new { m, obsoleteTypesUsed, obsoleteMethodsUsed, obsoleteFielsUsed } 
+0

все тот же, я хочу, чтобы callMe() также был распечатан. Но опять же, это, кажется, дает мед только «4 метода соответствует», но я хочу «5 методы соответствуют» –

+0

, который означает, что я хочу, чтобы распечатать ** ** только те методы, которые приведены в oConcreteM и игнорировать любые другие методы, которые устарели. если возможно –

+0

где вы хотите * распечатать только те методы, которые указаны в oConcreteM *? В первом столбце или в другом столбце? Если в другом столбце, какой элемент кода fo вы хотите увидеть в первом столбце? –