// Path: src/main/java/org/jasome/input/Type.java
// public class Type extends Code {
//     private final ClassOrInterfaceDeclaration declaration;
//     private Map<String, Method> methodLookup;
// 
//     public Type(ClassOrInterfaceDeclaration declaration) {
//         super(getClassNameFromDeclaration(declaration));
//         this.declaration = declaration;
//         this.methodLookup = new HashMap<>();
//     }
// 
//     public ClassOrInterfaceDeclaration getSource() {
//         return declaration;
//     }
// 
//     private static String getClassNameFromDeclaration(ClassOrInterfaceDeclaration classDefinition) {
//         String className = classDefinition.getNameAsString();
// 
//         if (classDefinition.getParentNode().isPresent()) {
//             Node parentNode = classDefinition.getParentNode().get();
//             if (parentNode instanceof ClassOrInterfaceDeclaration) {
//                 className = ((ClassOrInterfaceDeclaration) parentNode).getNameAsString() + "." +
//                         classDefinition.getNameAsString();
//             }
//         }
//         return className;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public Set<Method> getMethods() {
//         return (Set<Method>)(Set<?>)getChildren();
//     }
// 
//     public void addMethod(Method method) {
//         methodLookup.put(method.getSource().getSignature().asString(), method);
//         addChild(method);
//     }
// 
//     public Package getParentPackage() {
//         return (Package)getParent();
//     }
// 
//     @Override
//     public String toString() {
//         return "Type("+this.getName()+")";
//     }
// 
//     public Optional<Method> lookupMethodBySignature(String methodSignature) {
//         if(methodLookup.containsKey(methodSignature)) {
//             return Optional.of(methodLookup.get(methodSignature));
//         } else {
//             return Optional.empty();
//         }
//     }
// }
// 
// Path: src/main/java/org/jasome/metrics/Calculator.java
// public interface Calculator<T extends Code> {
// 
//     Set<Metric> calculate(T t);
// 
// }
// 
// Path: src/main/java/org/jasome/metrics/Metric.java
// public class Metric {
//     private String name;
//     private String description;
//     private NumericValue value;
// 
//     protected Metric(String name, String description, NumericValue value) {
//         this.name = name;
//         this.description = description;
//         this.value = value;
//     }
// 
//     public static Metric of(String name, String description, NumericValue value) {
//         return new Metric(name, description, value);
//     }
//     
//     public static Metric of(String name, String description, long value) {
//         return new Metric(name, description, NumericValue.of(value));
//     }
// 
//     public static Metric of(String name, String description, double value) {
//         return new Metric(name, description, NumericValue.of(value));
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public NumericValue getValue() {
//         return value;
//     }
//     
//     @Override
//     public String toString() {
//         return name + ": " + value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Metric)) return false;
//         Metric that = (Metric) o;
//         return Objects.equal(name, that.name) &&
//                 Objects.equal(description, that.description) &&
//                 Objects.equal(value, that.value);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(name, description, value);
//     }
// 
//     public String getFormattedValue() {
//         return value.toString();
//     }
// }


import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.google.common.collect.ImmutableSet;
import org.jasome.input.Type;
import org.jasome.metrics.Calculator;
import org.jasome.metrics.Metric;
import java.util.Set;
package org.jasome.metrics.calculators;



/**
 * Counts the number of fields and methods in a class.
 *
 * <ul>
 *     <li>NF - Number of Attributes (fields)</li>
 *     <li>NSF - Number of Static Attributes (fields)</li>
 *     <li>NPF - Number of Public Attributes (fields)</li>
 *     <li>NM - Number of Methods</li>
 *     <li>NSM - Number of Static Methods</li>
 *     <li>NPM - Number of Public Methods</li>
 * </ul>
 *
 * @author Rod Hilton
 * @since 0.2
 */
public class NumberOfFieldsCalculator implements Calculator<Type> {

    @Override
// Path: src/main/java/org/jasome/input/Type.java
// public class Type extends Code {
//     private final ClassOrInterfaceDeclaration declaration;
//     private Map<String, Method> methodLookup;
// 
//     public Type(ClassOrInterfaceDeclaration declaration) {
//         super(getClassNameFromDeclaration(declaration));
//         this.declaration = declaration;
//         this.methodLookup = new HashMap<>();
//     }
// 
//     public ClassOrInterfaceDeclaration getSource() {
//         return declaration;
//     }
// 
//     private static String getClassNameFromDeclaration(ClassOrInterfaceDeclaration classDefinition) {
//         String className = classDefinition.getNameAsString();
// 
//         if (classDefinition.getParentNode().isPresent()) {
//             Node parentNode = classDefinition.getParentNode().get();
//             if (parentNode instanceof ClassOrInterfaceDeclaration) {
//                 className = ((ClassOrInterfaceDeclaration) parentNode).getNameAsString() + "." +
//                         classDefinition.getNameAsString();
//             }
//         }
//         return className;
//     }
// 
//     @SuppressWarnings("unchecked")
//     public Set<Method> getMethods() {
//         return (Set<Method>)(Set<?>)getChildren();
//     }
// 
//     public void addMethod(Method method) {
//         methodLookup.put(method.getSource().getSignature().asString(), method);
//         addChild(method);
//     }
// 
//     public Package getParentPackage() {
//         return (Package)getParent();
//     }
// 
//     @Override
//     public String toString() {
//         return "Type("+this.getName()+")";
//     }
// 
//     public Optional<Method> lookupMethodBySignature(String methodSignature) {
//         if(methodLookup.containsKey(methodSignature)) {
//             return Optional.of(methodLookup.get(methodSignature));
//         } else {
//             return Optional.empty();
//         }
//     }
// }
// 
// Path: src/main/java/org/jasome/metrics/Calculator.java
// public interface Calculator<T extends Code> {
// 
//     Set<Metric> calculate(T t);
// 
// }
// 
// Path: src/main/java/org/jasome/metrics/Metric.java
// public class Metric {
//     private String name;
//     private String description;
//     private NumericValue value;
// 
//     protected Metric(String name, String description, NumericValue value) {
//         this.name = name;
//         this.description = description;
//         this.value = value;
//     }
// 
//     public static Metric of(String name, String description, NumericValue value) {
//         return new Metric(name, description, value);
//     }
//     
//     public static Metric of(String name, String description, long value) {
//         return new Metric(name, description, NumericValue.of(value));
//     }
// 
//     public static Metric of(String name, String description, double value) {
//         return new Metric(name, description, NumericValue.of(value));
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public NumericValue getValue() {
//         return value;
//     }
//     
//     @Override
//     public String toString() {
//         return name + ": " + value;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Metric)) return false;
//         Metric that = (Metric) o;
//         return Objects.equal(name, that.name) &&
//                 Objects.equal(description, that.description) &&
//                 Objects.equal(value, that.value);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hashCode(name, description, value);
//     }
// 
//     public String getFormattedValue() {
//         return value.toString();
//     }
// }


// Path: src/main/java/org/jasome/metrics/calculators/NumberOfFieldsCalculator.java
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.google.common.collect.ImmutableSet;
import org.jasome.input.Type;
import org.jasome.metrics.Calculator;
import org.jasome.metrics.Metric;
import java.util.Set;

package org.jasome.metrics.calculators;



/**
 * Counts the number of fields and methods in a class.
 *
 * <ul>
 *     <li>NF - Number of Attributes (fields)</li>
 *     <li>NSF - Number of Static Attributes (fields)</li>
 *     <li>NPF - Number of Public Attributes (fields)</li>
 *     <li>NM - Number of Methods</li>
 *     <li>NSM - Number of Static Methods</li>
 *     <li>NPM - Number of Public Methods</li>
 * </ul>
 *
 * @author Rod Hilton
 * @since 0.2
 */
public class NumberOfFieldsCalculator implements Calculator<Type> {

    @Override
    public Set<Metric> calculate(Type type) {