/** * 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 abs.frontend.analyser.ErrorMessage; import abs.frontend.analyser.TypeError; import abs.frontend.ast.AssignStmt; import abs.frontend.ast.FieldDecl; import abs.frontend.ast.Model; import abs.frontend.ast.TypedVarOrFieldDecl; import abs.frontend.ast.VarOrFieldDecl; public class FinalAnnotationTypeExtension extends DefaultTypeSystemExtension { public FinalAnnotationTypeExtension(Model m) { super(m); } @Override public void checkAssignStmt(AssignStmt s) { VarOrFieldDecl decl = s.getVar().getDecl(); if (decl instanceof TypedVarOrFieldDecl) { TypedVarOrFieldDecl d = (TypedVarOrFieldDecl)decl; // Not sure if this code will encounter delta bodies: if (d.isFinal()) { String name = d.getName(); boolean isField = (d instanceof FieldDecl); String kind = isField ? "field" : "variable"; add(new TypeError(s,ErrorMessage.ASSIGN_TO_FINAL,kind,name)); } } else { // It's a PatternVarDecl. Assume these are never final. } } }