/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.frontend.typechecker.ext; import java.util.List; import abs.frontend.analyser.AnnotationHelper; import abs.frontend.analyser.ErrorMessage; import abs.frontend.analyser.TypeError; import abs.frontend.ast.Annotation; import abs.frontend.ast.ClassDecl; import abs.frontend.ast.DataConstructorExp; import abs.frontend.ast.Model; import abs.frontend.ast.NewExp; import abs.frontend.typechecker.KindedName; import abs.frontend.typechecker.KindedName.Kind; public class ClassKindTypeExtension extends DefaultTypeSystemExtension { public ClassKindTypeExtension(Model m) { super(m); } @Override public void checkNewExp(NewExp e) { ClassDecl d = (ClassDecl) e.lookup(new KindedName(Kind.CLASS,e.getClassName())); List<Annotation> anns = AnnotationHelper.getAnnotationsOfType(d.getAnnotations(), "ABS.StdLib.ClassKindAnnotation"); if (!anns.isEmpty()) { String name = ((DataConstructorExp) anns.get(0).getValue()).getDecl().getName(); if (e.hasLocal()) { if (name.equals("COG")) { errors.add(new TypeError(e,ErrorMessage.CLASSKIND_PLAIN,d.getName())); } } else { if (!name.equals("COG")) { errors.add(new TypeError(e,ErrorMessage.CLASSKIND_COG,d.getName())); } } } } }