/*******************************************************************************
* Copyright (c) 2015, 2016 Google, Inc 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:
* Stefan Xenos (Google) - Initial implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.nd.indexer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.dom.IAnnotationBinding;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IMemberValuePairBinding;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.IPackageBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.internal.core.nd.Nd;
import org.eclipse.jdt.internal.core.nd.java.JavaIndex;
import org.eclipse.jdt.internal.core.nd.java.JavaNames;
import org.eclipse.jdt.internal.core.nd.java.NdResourceFile;
import org.eclipse.jdt.internal.core.nd.java.NdTreeNode;
import org.eclipse.jdt.internal.core.nd.java.NdType;
import org.eclipse.jdt.internal.core.nd.java.NdTypeId;
import org.eclipse.jdt.internal.core.nd.java.NdTypeInterface;
public class BindingToIndexConverter {
private static final boolean ENABLE_LOGGING = false;
private JavaIndex index;
private NdResourceFile resource;
public BindingToIndexConverter(NdResourceFile resource) {
this.resource = resource;
this.index = JavaIndex.getIndex(resource.getNd());
}
public void addBinding(NdTreeNode parent, IBinding binding, IProgressMonitor monitor) {
switch (binding.getKind()) {
case IBinding.TYPE:
addType((ITypeBinding) binding, monitor);
break;
case IBinding.ANNOTATION:
addAnnotation(parent, (IAnnotationBinding) binding, monitor);
break;
case IBinding.METHOD:
addMethod(parent, (IMethodBinding) binding, monitor);
break;
case IBinding.VARIABLE:
addVariable(parent, (IVariableBinding) binding, monitor);
break;
case IBinding.PACKAGE:
addPackage(parent, (IPackageBinding) binding, monitor);
break;
case IBinding.MEMBER_VALUE_PAIR:
addMemberValuePair(parent, (IMemberValuePairBinding) binding, monitor);
break;
default:
Package.log("Encountered unknown binding type: " + binding.getKind(), null); //$NON-NLS-1$
}
}
public void addMemberValuePair(NdTreeNode parent, IMemberValuePairBinding binding, IProgressMonitor monitor) {
logInfo("Adding member value pair: " + binding.getName()); //$NON-NLS-1$
}
public void addPackage(NdTreeNode parent, IPackageBinding binding, IProgressMonitor monitor) {
logInfo("Adding package: " + binding.getName()); //$NON-NLS-1$
}
public void addVariable(NdTreeNode parent, IVariableBinding binding, IProgressMonitor monitor) {
logInfo("Adding variable: " + binding.getName()); //$NON-NLS-1$
}
public void addMethod(NdTreeNode parent, IMethodBinding binding, IProgressMonitor monitor) {
logInfo("Adding method: " + binding.getName()); //$NON-NLS-1$
}
public void addAnnotation(NdTreeNode parent, IAnnotationBinding binding, IProgressMonitor monitor) {
logInfo("Adding annotation: " + binding.getName()); //$NON-NLS-1$
}
public NdType addType(ITypeBinding binding, IProgressMonitor monitor) {
logInfo("Adding type: " + binding.getBinaryName()); //$NON-NLS-1$
NdTypeId name = makeTypeId(binding);
NdType type = name.findTypeByResourceAddress(this.resource.address);
if (type == null) {
type = new NdType(getNd(), this.resource);
}
type.setTypeId(name);
ITypeBinding superclass = binding.getSuperclass();
if (superclass != null) {
type.setSuperclass(makeTypeId(superclass));
}
for (ITypeBinding next : binding.getInterfaces()) {
new NdTypeInterface(getNd(), type, makeTypeId(next));
}
return type;
}
private void logInfo(String string) {
if (ENABLE_LOGGING) {
Package.logInfo(string);
}
}
private NdTypeId makeTypeId(ITypeBinding forBinding) {
return this.index.createTypeId(JavaNames.binaryNameToFieldDescriptor(forBinding.getBinaryName().toCharArray()));
}
private Nd getNd() {
return this.resource.getNd();
}
}