/******************************************************************************* * Copyright (c) 2009 xored software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.xotcl.internal.core.parser.structure; import java.util.HashMap; import java.util.Map; import org.eclipse.dltk.tcl.core.TclParseUtil; import org.eclipse.dltk.tcl.structure.ITclModelBuildContext; import org.eclipse.dltk.tcl.structure.ITclTypeHandler; public class XOTclNames { private static final String ATTR = XOTclNames.class.getName(); public static XOTclNames get(ITclModelBuildContext context) { return (XOTclNames) context.getAttribute(ATTR); } public static XOTclNames create(ITclModelBuildContext context) { XOTclNames names = get(context); if (names == null) { names = new XOTclNames(); context.setAttribute(ATTR, names); } return names; } static class XOTclTypeInfo { final String[] segments; public XOTclTypeInfo(String[] segments) { this.segments = segments; } /** * @param parts * @return */ public boolean endsWith(String[] parts) { final int pLen = parts.length; final int sLen = segments.length; if (pLen <= sLen) { final int offset = sLen - pLen; for (int i = 0; i < pLen; ++i) { if (!parts[i].equals(segments[offset + i])) { return false; } } return true; } return false; } /** * @return */ public String getSimpleName() { return segments[segments.length - 1]; } } private final Map<String, Map<String, XOTclTypeInfo>> names = new HashMap<String, Map<String, XOTclTypeInfo>>(); /** * @param typeInfo * @param resolvedType */ public void addType(ITclTypeHandler resolvedType) { String namespace = resolvedType.getNamespace(); if (namespace.startsWith("::")) { //$NON-NLS-1$ namespace = namespace.substring(2); } if (namespace.length() == 0) { return; } final String[] segments = TclParseUtil.tclSplit(namespace); if (segments.length == 0) { return; } final String lastName = segments[segments.length - 1]; Map<String, XOTclTypeInfo> types = names.get(lastName); if (types == null) { types = new HashMap<String, XOTclTypeInfo>(); names.put(lastName, types); } if (!types.containsKey(namespace)) { types.put(namespace, new XOTclTypeInfo(segments)); } } /** * @param name * @param nameArgument * @return */ public XOTclType resolve(String name) { String[] segments = TclParseUtil.tclSplit(name); if (segments.length == 0) { return null; } final Map<String, XOTclTypeInfo> types = names .get(segments[segments.length - 1]); if (types == null) { return null; } for (Map.Entry<String, XOTclTypeInfo> entry : types.entrySet()) { if (entry.getValue().endsWith(segments)) { return new XOTclType(entry.getKey(), entry.getValue()); } } return null; } }