/** * 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; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import abs.frontend.analyser.ErrorMessage; import abs.frontend.analyser.TypeError; import abs.frontend.ast.ModuleDecl; import abs.frontend.ast.Name; import abs.frontend.typechecker.KindedName.Kind; @SuppressWarnings("serial") public class ResolvedMap extends HashMap<KindedName, ResolvedName> { public ResolvedMap() { super(); } public ResolvedMap(Map<KindedName, ResolvedName> init) { super(init); } public ResolvedMap getAllNames(String name) { ResolvedMap map = new ResolvedMap(); for (Kind k : Kind.values()) { KindedName kn = new KindedName(k, name); ResolvedName rn = get(kn); if (rn != null) { map.put(kn, rn); } } return map; } public void putKindedNames(String name, ResolvedMap sourceMap) { putAll(sourceMap.getAllNames(name)); } public void putKindedNamesNoHiding(String name, ResolvedMap sourceMap) { addAllNamesNoHiding(sourceMap.getAllNames(name)); } /** * add all entries from one map to an this one. * when there is a duplicate key, the ResolvedName is not overridden, but replaced * by an instance of ResolvedAmbigiousName * * @param source */ void addAllNamesNoHiding(ResolvedMap source) { for (Entry<KindedName, ResolvedName> e : source.entrySet()) { KindedName kindedName = e.getKey(); ResolvedName resolvedName = e.getValue(); ResolvedName prev = put(kindedName, resolvedName); if (prev != null && !(prev.equals(resolvedName))) { // name is ambiguous put(kindedName, new ResolvedAmbigiousName(prev, resolvedName)); } } } public void putNamesOfModule(ModuleDecl mod, ResolvedMap with, String moduleName, String simpleNamePattern) { for (Map.Entry<KindedName, ResolvedName> entry : with.entrySet()) { KindedName kn = entry.getKey(); if (kn.isQualified()) { if (kn.getModuleName().equals(moduleName)) { String simpleName = kn.getSimpleName(); if (simpleNamePattern == null || simpleNamePattern.equals(simpleName)) { put(new KindedName(kn.getKind(), mod.getName() + "." + simpleName), entry.getValue()); put(new KindedName(kn.getKind(), simpleName), entry.getValue()); } } } } } public void addAllNames(ResolvedMap source, Name n) { ResolvedMap allNames = source.getAllNames(n.getSimpleName()); if (!allNames.isEmpty()) { for (Entry<KindedName, ResolvedName> e : allNames.entrySet()) { put(new KindedName(e.getKey().getKind(), n.getModuleName() + "." + e.getKey().getName()), e.getValue()); } } else { throw new TypeCheckerException(new TypeError(n, ErrorMessage.NAME_NOT_EXPORTED_BY_MODULE, n.getSimpleName(), n.getModuleName())); } } }