package org.mutabilitydetector.checkers;





import static org.mutabilitydetector.checkers.AccessModifierQuery.type;

import org.mutabilitydetector.MutabilityReason;
import org.mutabilitydetector.locations.CodeLocation.ClassLocation;

/**
 * This checker visits types and fields. Types can be visited separately, fields should be visited as part of visiting
 * an outer type.
 * 
 * The rules of inherent mutability are defined as:
 * 
 * Inherently mutable: Interfaces; Abstract classes
 * 
 * Inherently immutable: Enum types; primitive types ie. boolean, char, byte, short, int, long, float, double
 * 
 * @author Graham Allan / Grundlefleck at gmail dot com
 * 
 */
public final class InherentTypeMutabilityChecker extends AsmMutabilityChecker {

    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
        super.visit(version, access, name, signature, superName, interfaces);

        if (type(access).isAbstract() || type(access).isInterface()) {
            setResult("Is inherently mutable, as declared as an abstract type.",
                    ClassLocation.fromInternalName(name),
                    MutabilityReason.ABSTRACT_TYPE_INHERENTLY_MUTABLE);
        }
    }

}
