Beispiel #1
0
		public static void EvaluateCohesion(ClassProperties cls)
		{
			double totalaccess = 0;
			foreach (var field in cls.Fields)
				totalaccess += field.Value.InternalAccessCount;
			
			cls.LCOM = 1 - (double)(totalaccess/(cls.Class.Methods.Count()*cls.Class.Fields.Count()));
			cls.LCOM_HS = (cls.Class.Methods.Count() - totalaccess/cls.Class.Fields.Count())/(cls.Class.Methods.Count()-1);
			
		}
Beispiel #2
0
        public static void EvaluateCohesion(ClassProperties cls)
        {
            double totalaccess = 0;

            foreach (var field in cls.Fields)
            {
                totalaccess += field.Value.InternalAccessCount;
            }

            cls.LCOM    = 1 - (double)(totalaccess / (cls.Class.MethodCount * cls.Class.FieldCount));
            cls.LCOM_HS = (cls.Class.MethodCount - totalaccess / cls.Class.FieldCount) / (cls.Class.MethodCount - 1);
        }
		private static ClassProperties RecursiveFindInstance (IType cls, ClassProperties prop)
		{
			foreach (var innercls in prop.InnerClasses) {
				var ret = RecursiveFindInstance (cls, innercls.Value);
				if (ret != null)
					return ret;
			}
			
			if (prop.Class.FullName == cls.FullName)
				return prop;
			return null;
		}
 private void RecursiveProcessClasses(ClassProperties cls)
 {
     foreach (var innercls in cls.InnerClasses)
     {
         RecursiveProcessClasses(innercls.Value);
         cls.CyclometricComplexity += innercls.Value.CyclometricComplexity;
         cls.ClassCoupling         += innercls.Value.ClassCoupling;
         cls.LOCReal     += innercls.Value.LOCReal;
         cls.LOCComments += innercls.Value.LOCComments;
         cls.FieldCount  += innercls.Value.FieldCount;
         cls.MethodCount += innercls.Value.MethodCount;
     }
 }
Beispiel #5
0
 private bool RecursiveInstanceExists(ClassProperties cls, string clsName)
 {
     if (cls.InnerClasses.ContainsKey(clsName))
     {
         return(true);
     }
     foreach (var innercls in cls.InnerClasses)
     {
         if (RecursiveInstanceExists(innercls.Value, clsName))
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #6
0
 private EnumProperties RecursiveGetEnumReference(ClassProperties cls, string key)
 {
     foreach (var innercls in cls.InnerClasses)
     {
         if (innercls.Value.InnerEnums.ContainsKey(key))
         {
             return(innercls.Value.InnerEnums[key]);
         }
         var ret = RecursiveGetEnumReference(innercls.Value, key);
         if (ret != null)
         {
             return(ret);
         }
     }
     return(null);
 }
Beispiel #7
0
 private ClassProperties RecursiveFindRefCls(ClassProperties cls, string key)
 {
     if (cls.InnerClasses.ContainsKey(key))
     {
         return(cls.InnerClasses[key]);
     }
     foreach (var innercls in cls.InnerClasses)
     {
         var ret = RecursiveFindRefCls(innercls.Value, key);
         if (ret != null)
         {
             return(ret);
         }
     }
     return(null);
 }
Beispiel #8
0
 private MethodProperties RecursiveFindRefMeth(ClassProperties cls, string key)
 {
     foreach (var innercls in cls.InnerClasses)
     {
         if (innercls.Value.Methods.ContainsKey(key))
         {
             return(innercls.Value.Methods[key]);
         }
         var ret = RecursiveFindRefMeth(innercls.Value, key);
         if (ret != null)
         {
             return(ret);
         }
     }
     return(null);
 }
Beispiel #9
0
 private StructProperties RecursiveGetStructReference(ClassProperties cls, string key)
 {
     if (cls.InnerClasses.ContainsKey(key))
     {
         return(cls.InnerStructs[key]);
     }
     foreach (var innercls in cls.InnerClasses)
     {
         var ret = RecursiveGetStructReference(innercls.Value, key);
         if (ret != null)
         {
             return(ret);
         }
     }
     return(null);
 }
        private static ClassProperties RecursiveFindInstance(IType cls, ClassProperties prop)
        {
            foreach (var innercls in prop.InnerClasses)
            {
                var ret = RecursiveFindInstance(cls, innercls.Value);
                if (ret != null)
                {
                    return(ret);
                }
            }

            if (prop.Class.FullName == cls.FullName)
            {
                return(prop);
            }
            return(null);
        }
		private static void ClassEvaluateInheritanceTree (MetricsContext ctx, ClassProperties cls)
		{
			foreach (IType ob in cls.Class.SourceProjectDom.GetInheritanceTree (cls.Class)) {
				if (ob.ClassType == MonoDevelop.Projects.Dom.ClassType.Class && ob != cls.Class && ob.Name!="Object") {
					cls.DepthOfInheritance++;
					ClassProperties tmp = ctx.GetInstanceOf (ob);
					// lock tmp here
					if(tmp != null) {
						tmp.FanOut++;
						cls.InheritedFieldCount += tmp.FieldCount;
						cls.InheritedMethodCount += tmp.MethodCount;
						if (ob.IsAbstract)
							cls.DataAbstractionCoupling++;
					}
				}
			foreach (var innercls in cls.InnerClasses) {
				ClassEvaluateInheritanceTree (ctx, innercls.Value);
				}
			}
		}
		private static void ClassEvaluateInheritanceTree (MetricsContext ctx, ClassProperties cls)
		{
			foreach (var ob in cls.Class.GetAllBaseTypeDefinitions ()) {
				if (ob.Kind == TypeKind.Class && ob != cls.Class && ob.Name!="Object") {
					cls.DepthOfInheritance++;
					ClassProperties tmp = ctx.GetInstanceOf (ob);
					// lock tmp here
					if(tmp != null) {
						tmp.FanOut++;
						cls.InheritedFieldCount += tmp.FieldCount;
						cls.InheritedMethodCount += tmp.MethodCount;
						if (ob.IsAbstract)
							cls.DataAbstractionCoupling++;
					}
				}
			foreach (var innercls in cls.InnerClasses) {
				ClassEvaluateInheritanceTree (ctx, innercls.Value);
				}
			}
		}
Beispiel #13
0
        private static StringBuilder GenerateClassMetricText(ClassProperties item)
        {
            StringBuilder results = new StringBuilder();

            results.Append(GettextCatalog.GetString("\nName : ") + item.FullName);
            results.Append(GettextCatalog.GetString("\nDepth of inheritance : ") + item.DepthOfInheritance);
            results.Append(GettextCatalog.GetString("\nNumber of children : ") + item.FanOut);
            results.Append(GettextCatalog.GetString("\nAfferent Coupling : ") + item.AfferentCoupling);
            results.Append(GettextCatalog.GetString("\nEfferent Coupling : ") + item.EfferentCoupling);
            results.Append(GettextCatalog.GetString("\nData abstraction coupling : ") + item.DataAbstractionCoupling);
            results.Append(GettextCatalog.GetString("\nConstructors : ") + item.ConstructorCount);
            results.Append(GettextCatalog.GetString("\nDelegates : ") + item.DelegateCount);
            results.Append(GettextCatalog.GetString("\nEvents : ") + item.EventCount);
            results.Append(GettextCatalog.GetString("\nFields : ") + item.FieldCount);
            results.Append(GettextCatalog.GetString("\nInner classes : ") + item.InnerClassCount);
            results.Append(GettextCatalog.GetString("\nStructs : ") + item.StructCount);
            results.Append(GettextCatalog.GetString("\nMethods : ") + item.MethodCount);
            results.Append(GettextCatalog.GetString("\nProperties : ") + item.Class.PropertyCount);
            results.Append(GettextCatalog.GetString("\nLack of cohesion of methods : ") + item.LCOM);
            results.Append(GettextCatalog.GetString("\nLack of cohesion of methods (Henderson-Sellers) : ") + item.LCOM_HS);
            return(results);
        }
        public MethodProperties(ICSharpCode.OldNRefactory.Ast.INode m, ClassProperties prop)
        {
            mthd          = null;
            ParameterList = new List <string> (0);
            if (m is MethodDeclaration)
            {
                mthdAst = (MethodDeclaration)m;
                VisitMethodMember((MethodDeclaration)m, prop);
                this.FullName = prop.FullName + "." + ((MethodDeclaration)m).Name.Substring(((MethodDeclaration)m).Name.LastIndexOf(".") + 1);
            }
            else if (m is ConstructorDeclaration)
            {
                mthdAst = (ConstructorDeclaration)m;
                VisitConstructorMember((ConstructorDeclaration)m, prop);
                this.FullName = prop.FullName + "." + ((ConstructorDeclaration)m).Name.Substring(((ConstructorDeclaration)m).Name.LastIndexOf(".") + 1);
            }

            AfferentCoupling = 0;
            EfferentCoupling = 0;
            FilePath         = "";
            this.ParentClass = prop;
            this.StartLine   = mthdAst.StartLocation.Line;
            this.EndLine     = mthdAst.EndLocation.Line;
        }
		private static StringBuilder GenerateClassMetricText(ClassProperties item)
		{
			StringBuilder results = new StringBuilder();
			results.Append(GettextCatalog.GetString("\nName : ") + item.FullName);
			results.Append(GettextCatalog.GetString("\nDepth of inheritance : ") + item.DepthOfInheritance);
			results.Append(GettextCatalog.GetString("\nNumber of children : ") + item.FanOut);
			results.Append(GettextCatalog.GetString("\nAfferent Coupling : ") + item.AfferentCoupling);
			results.Append(GettextCatalog.GetString("\nEfferent Coupling : ") + item.EfferentCoupling);
			results.Append(GettextCatalog.GetString("\nData abstraction coupling : ") + item.DataAbstractionCoupling);
			results.Append(GettextCatalog.GetString("\nConstructors : ") + item.ConstructorCount);
			results.Append(GettextCatalog.GetString("\nDelegates : ") + item.DelegateCount);
			results.Append(GettextCatalog.GetString("\nEvents : ") + item.EventCount);
			results.Append(GettextCatalog.GetString("\nFields : ") + item.FieldCount);
			results.Append(GettextCatalog.GetString("\nInner classes : ") + item.InnerClassCount);
			results.Append(GettextCatalog.GetString("\nStructs : ") + item.StructCount);
			results.Append(GettextCatalog.GetString("\nMethods : ") + item.MethodCount);
			results.Append(GettextCatalog.GetString("\nProperties : ") + item.Class.PropertyCount);
			results.Append(GettextCatalog.GetString("\nLack of cohesion of methods : ") + item.LCOM);
			results.Append(GettextCatalog.GetString("\nLack of cohesion of methods (Henderson-Sellers) : ") + item.LCOM_HS);
			return results;
		}
		public void VisitMethodMember(MethodDeclaration node, ClassProperties prop)
		{
			foreach(var param in node.Parameters) {
				ParameterList.Add(param.Type.ToString ());
			}
			this.StartLine = node.Body.StartLocation.Line;
			this.EndLine = node.Body.EndLocation.Line;
		}
		public MethodProperties (ICSharpCode.OldNRefactory.Ast.INode m, ClassProperties prop)
		{
			mthd=null;
			ParameterList = new List<string> (0);
			if(m is MethodDeclaration) {
				mthdAst = (MethodDeclaration)m;
				VisitMethodMember((MethodDeclaration)m, prop);
				this.FullName = prop.FullName + "." + ((MethodDeclaration)m).Name.Substring(((MethodDeclaration)m).Name.LastIndexOf(".")+1);
			} else if(m is ConstructorDeclaration) {
				mthdAst = (ConstructorDeclaration)m;
				VisitConstructorMember((ConstructorDeclaration)m, prop);
				this.FullName = prop.FullName + "." + ((ConstructorDeclaration)m).Name.Substring(((ConstructorDeclaration)m).Name.LastIndexOf(".")+1);
			}
			
			AfferentCoupling=0;
			EfferentCoupling=0;
			FilePath="";
			this.ParentClass = prop;
			this.StartLine = mthdAst.StartLocation.Line;
			this.EndLine = mthdAst.EndLocation.Line;

		}
		public void VisitConstructorMember(ConstructorDeclaration node, ClassProperties prop)
		{
			foreach(var param in node.Parameters) {
				ParameterList.Add(param.TypeReference.Type);
			}
			this.StartLine = node.Body.StartLocation.Line;
			this.EndLine = node.Body.EndLocation.Line;
		}
		private bool RecursiveInstanceExists(ClassProperties cls, string clsName)
		{
			if(cls.InnerClasses.ContainsKey(clsName))
				return true;
			foreach(var innercls in cls.InnerClasses) {
				if(RecursiveInstanceExists(innercls.Value, clsName))
					return true;
			}
			return false;
		}
		private StructProperties RecursiveGetStructReference (ClassProperties cls, string key)
		{
			if(cls.InnerClasses.ContainsKey(key))
				return cls.InnerStructs[key];
			foreach (var innercls in cls.InnerClasses)
			{
				var ret = RecursiveGetStructReference (innercls.Value, key);
				if(ret!=null)
					return ret;
			}
			return null;
		}
		private EnumProperties RecursiveGetEnumReference (ClassProperties cls, string key)
		{
			foreach (var innercls in cls.InnerClasses)
			{
				if(innercls.Value.InnerEnums.ContainsKey(key))
					return innercls.Value.InnerEnums[key];
				var ret = RecursiveGetEnumReference (innercls.Value, key);
				if(ret!=null)
					return ret;
			}
			return null;
		}
		private ClassProperties RecursiveFindRefCls (ClassProperties cls, string key)
		{
			if(cls.InnerClasses.ContainsKey(key))
				return cls.InnerClasses[key];
			foreach (var innercls in cls.InnerClasses)
			{
				var ret = RecursiveFindRefCls (innercls.Value, key);
				if(ret!=null)
					return ret;
			}
			return null;
		}
		private MethodProperties RecursiveFindRefMeth (ClassProperties cls, string key)
		{
			foreach(var innercls in cls.InnerClasses)
			{
				if(innercls.Value.Methods.ContainsKey(key))
					return innercls.Value.Methods[key];
				var ret = RecursiveFindRefMeth(innercls.Value, key);
				if(ret!=null)
					return ret;
			}
			return null;
		}
			internal static void EvaluateComplexityMetrics (ICSharpCode.NRefactory.Ast.INode method, MethodProperties props)
			{
				props.CyclometricComplexity = 1;
				props.LOCReal=0;
				props.NumberOfVariables=0;
				
				cls = props.ParentClass;
				
				ASTVisitor ctxAstVisitor = new ASTVisitor();
				if(method is MethodDeclaration) {
					foreach (var statement in ((MethodDeclaration)method).Body.Children) {
						ctxAstVisitor.VisitStatement(statement, props);
					}
				} else if (method is ConstructorDeclaration) {
					foreach (var statement in ((ConstructorDeclaration)method).Body.Children) {
						ctxAstVisitor.VisitStatement(statement, props);
					}
				}
				cls.CyclometricComplexity += props.CyclometricComplexity;
			}
		private void RecursiveProcessClasses(ClassProperties cls)
		{
			foreach(var innercls in cls.InnerClasses)
			{
				RecursiveProcessClasses(innercls.Value);
				cls.CyclometricComplexity += innercls.Value.CyclometricComplexity;
				cls.ClassCoupling += innercls.Value.ClassCoupling;
				cls.LOCReal += innercls.Value.LOCReal;
				cls.LOCComments += innercls.Value.LOCComments;
				cls.FieldCount += innercls.Value.FieldCount;
				cls.MethodCount += innercls.Value.MethodCount;
			}
		}