/******************************************************************************* * Copyright © 2005, 2013 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.core.internal.dependency; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.edt.compiler.binding.IPackageBinding; import org.eclipse.edt.compiler.core.ast.Name; import org.eclipse.edt.compiler.core.ast.QualifiedName; import org.eclipse.edt.compiler.internal.core.dependency.IDependencyRequestor; import org.eclipse.edt.mof.egl.AnnotationType; import org.eclipse.edt.mof.egl.ArrayType; import org.eclipse.edt.mof.egl.Constructor; import org.eclipse.edt.mof.egl.StructPart; import org.eclipse.edt.mof.egl.Type; import org.eclipse.edt.mof.utils.NameUtile; /** * @author svihovec * */ public class DependencyInfo extends AbstractDependencyInfo implements IDependencyInfo, IDependencyRequestor { private Set<String> simpleNames = new HashSet(); private Set<String> qualifiedNames = new HashSet(); @Override public Set getQualifiedNames() { return Collections.unmodifiableSet(qualifiedNames); } @Override public Set getSimpleNames() { return Collections.unmodifiableSet(simpleNames); } @Override public void recordName(Name name){ if(name.isSimpleName()){ recordSimpleName(name.getIdentifier()); }else if(name.isQualifiedName()){ recordQualifiedName(NameUtile.getAsName(((QualifiedName)name).getNameComponents())); } } @Override public void recordSimpleName(String simpleName) { if(!containsSimpleName(simpleName)){ addSimpleName(simpleName); } } @Override public void recordPackageBinding(IPackageBinding packageBinding){ recordQualifiedName(NameUtile.getAsName(packageBinding.getPackageName())); } @Override public void recordType(Type type) { if (type == null) { return; } if(type instanceof AnnotationType){ return; } if(type instanceof ArrayType){ recordType(((ArrayType)type).getElementType()); return; } if(type instanceof Function || type instanceof Constructor) { return; } if(type instanceof StructPart){ List<StructPart> extendedTypes = ((StructPart)type).getSuperTypes(); for (StructPart struct : extendedTypes) { doRecordTypeBinding(struct); } } doRecordTypeBinding(type); } private void doRecordTypeBinding(Type type){ recordQualifiedName(NameUtile.getAsName(type.getTypeSignature())); } @Override protected void recordQualifiedName(String qualifiedName){ if (qualifiedName.length() == 0) { return; } int lastDot = qualifiedName.lastIndexOf('.'); while (lastDot != -1) { if (containsQualifiedName(qualifiedName)) { qualifiedName = null; lastDot = -1; } else { addQualifiedName(qualifiedName); recordSimpleName(NameUtile.getAsName(qualifiedName.substring(lastDot + 1))); qualifiedName = qualifiedName.substring(0, lastDot); lastDot = qualifiedName.lastIndexOf('.'); } } if (qualifiedName != null) { recordSimpleName(qualifiedName); } } private void addSimpleName(String simpleName){ simpleNames.add(simpleName); } private void addQualifiedName(String qualifiedName){ qualifiedNames.add(qualifiedName); } private boolean containsSimpleName(String simpleName){ return simpleNames.contains(simpleName); } private boolean containsQualifiedName(String qualifiedName){ return qualifiedNames.contains(qualifiedName); } }