2010-03-04 3 views
7

J'essaie d'obtenir NDepend pour identifier des méthodes longues en utilisant une version modifiée de la requête standard "Méthodes trop grandes". Je ne veux pas signaler de longues méthodes sur lesquelles les développeurs ont peu de contrôle, donc je filtre le code généré en utilisant l'attribut DebuggerNonUserCode et InitializeComponent().Comment faire pour limiter la requête de méthodes NDepend sur l'attribut de type

Malheureusement, je reçois encore quelques faux positifs car les méthodes dans les types générés sont également signalées. Le problème est que même si le type lui-même a l'attribut DebuggerNonUserCode, les méthodes ne le font pas, elles sont donc incluses dans la sortie malgré le fait qu'elles sont générées. Je cherche quelque chose comme une jointure entre les types et les méthodes: Donnez-moi tous les types qui n'ont pas l'attribut DebuggerNonUserCode et exécutez la requête sur ceux-ci, mais je ne peux pas comprendre comment exprimer cela en CQL.

Pour certains des assemblages, je peux simplement filtrer sur le nom complet, mais malheureusement certains de nos assemblages mélangent les types créés et générés par le développeur. Malheureusement, le IsGeneratedByCompiler ne peut pas être utilisé dans ce cas.

Ma requête

WARN IF Count > 0 IN SELECT METHODS WHERE 
    NbLinesOfCode > 30 AND 
    !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND 
    !NameIs "InitializeComponent()" 
    ORDER BY NbLinesOfCode DESC 
+0

Je n'ai pas trouvé de moyen de joindre des méthodes et de taper des informations et même les notes de publication de V3 ne le mentionnent pas. – Timores

+1

Avez-vous essayé l'attribut de méthode IsGeneratedByCompiler? – Timores

+0

@Timores: Exactement, je voudrais pouvoir faire une jointure entre les deux. Je n'ai pas regardé IsGeneratedByCompiler. De la documentation, il ne semble pas faire l'affaire. mais je vais quand même essayer et mettre à jour la question. –

Répondre

2

Brian, grâce à Code Rule over LINQ Query (CQLinq) le code source de la règle de code que vous demandez est:

warnif count > 0 
from m in Application.Methods where 
    m.NbLinesOfCode > 30 && 
!m.ParentType.HasAttribute("System.Diagnostics.DebuggerNonUserCodeAttribute") && 
    m.Name != "InitializeComponent()" 
orderby m.NbLinesOfCode descending 
select new { m, m.NbLinesOfCode } 

La syntaxe CQLinq offre également un moyen de définir ce qui est Just-My-Code. Cette fonctionnalité est décrire here. Fondamentalement, vous devez définir l'ensemble JustMyCode à travers les requêtes préfixées par notmycode. Ensuite, la règle que vous demandez peut facilement être réécrite:

warnif count > 0 
from m in JustMyCode.Methods where 
    m.NbLinesOfCode > 30 
orderby m.NbLinesOfCode descending  
select new { m, m.NbLinesOfCode } 

L'ensemble JustMyCode défini une fois pour toutes peuvent être réutilisés sur toute règle de code. De plus, vous pouvez regarder le notmycode par défaut Discard generated and designer Methods from JustMyCode

+0

Merci pour l'effort. –

+0

Cela semble beaucoup mieux, merci pour l'effort! – flq

0

Je aime bien NDepend, mais il est toujours la plus grande lacune unique d'information namespace/type/méthode ne peut pas être joint en une seule requête. Cette fonctionnalité rendrait CQL vraiment puissant.

Outre que les contrôles de IsGeneratedByCompiler 'et 'IsInFrameworkAssembly' peut être utile. Vous pouvez également décapant certains espaces de noms de la requête (OUT OF NAMESPACES "...")

+0

Il le ferait certainement!Je suis conscient de la fonction OUT OF, mais malheureusement les assemblées pertinentes regroupent à la fois le code dev et le code généré dans le même espace de noms :( –

+0

flq, Brian, regardez ma réponse ci-dessus :) –

Questions connexes