mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
165213: undo misadventure with abstraction
This commit is contained in:
parent
3329794554
commit
773b11c204
24 changed files with 446 additions and 904 deletions
|
@ -0,0 +1,71 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.index.tests;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.testplugin.CTestPlugin;
|
||||
import org.eclipse.cdt.core.testplugin.TestScannerProvider;
|
||||
import org.eclipse.cdt.internal.core.CCoreInternals;
|
||||
import org.eclipse.cdt.utils.spawner.EnvironmentReader;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.osgi.framework.Bundle;
|
||||
|
||||
/**
|
||||
* aftodo - it would be nice to have this as a real performance test
|
||||
*
|
||||
* n.b. this is intentionally not added to any test suite at the moment
|
||||
*/
|
||||
public class TrilogyPerformanceTest extends IndexTestBase {
|
||||
ICProject cproject;
|
||||
|
||||
public TrilogyPerformanceTest() {
|
||||
super("TrilogyPerformance");
|
||||
}
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
Bundle b = CTestPlugin.getDefault().getBundle();
|
||||
if (cproject == null) {
|
||||
cproject= createProject(true, "resources/indexTests/trilogy");
|
||||
}
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
cproject.getProject().delete(true, new NullProgressMonitor());
|
||||
}
|
||||
|
||||
// you must have the Windows SDK installed and the INETSDK env var setup
|
||||
public void testIndexTrilogyPerformanceTimes() throws CoreException {
|
||||
if(Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor()));
|
||||
TestScannerProvider.sIncludes = new String[]{EnvironmentReader.getEnvVar("INETSDK")+"\\Include"};
|
||||
try {
|
||||
CCoreInternals.getPDOMManager().setIndexAllFiles(cproject, true);
|
||||
long start = System.currentTimeMillis();
|
||||
CCorePlugin.getPDOMManager().reindex(cproject);
|
||||
assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor()));
|
||||
System.out.println("Took: "+(System.currentTimeMillis() - start));
|
||||
IIndex index= CCorePlugin.getIndexManager().getIndex(cproject);
|
||||
IBinding[] binding = index.findBindings(Pattern.compile("IXMLElementCollection"), false, IndexFilter.ALL, new NullProgressMonitor());
|
||||
assertEquals(1, binding.length);
|
||||
} finally {
|
||||
TestScannerProvider.sIncludes = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include <iostream>
|
||||
|
||||
int main() { return 0; }
|
|
@ -28,7 +28,6 @@ Export-Package: org.eclipse.cdt.core,
|
|||
org.eclipse.cdt.internal.core;x-friends:="org.eclipse.cdt.ui",
|
||||
org.eclipse.cdt.internal.core.browser.util;x-internal:=true,
|
||||
org.eclipse.cdt.internal.core.dom;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.refactoring",
|
||||
org.eclipse.cdt.internal.core.dom.bid,
|
||||
org.eclipse.cdt.internal.core.dom.parser;x-friends:="org.eclipse.cdt.refactoring",
|
||||
org.eclipse.cdt.internal.core.dom.parser.c;x-friends:="org.eclipse.cdt.refactoring",
|
||||
org.eclipse.cdt.internal.core.dom.parser.cpp;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.refactoring",
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractCLocalBindingIdentity implements ICLocalBindingIdentity {
|
||||
protected static final String SEP = " | "; //$NON-NLS-1$
|
||||
|
||||
protected PDOMLinkage linkage;
|
||||
protected IBinding binding;
|
||||
|
||||
protected String extendedType; // cached
|
||||
|
||||
protected AbstractCLocalBindingIdentity(IBinding binding, PDOMLinkage linkage) {
|
||||
if(binding==null || linkage==null)
|
||||
throw new IllegalArgumentException();
|
||||
this.binding = binding;
|
||||
this.linkage = linkage;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return binding.getName();
|
||||
}
|
||||
|
||||
public abstract int getTypeConstant() throws CoreException;
|
||||
|
||||
public abstract String getExtendedType() throws CoreException;
|
||||
|
||||
public String toString() {
|
||||
try {
|
||||
return getName()+SEP+getTypeConstant()+SEP+getExtendedType();
|
||||
} catch(CoreException ce) {
|
||||
throw new RuntimeException(ce);
|
||||
}
|
||||
}
|
||||
|
||||
public char[] getNameCharArray() throws CoreException {
|
||||
return binding.getNameCharArray();
|
||||
}
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* An implementation of ILocalBindingIdentityComparator for CLocalBinding objects
|
||||
*/
|
||||
public class CLocalBindingIdentityComparator implements ILocalBindingIdentityComparator {
|
||||
protected IBindingIdentityFactory factory;
|
||||
|
||||
public CLocalBindingIdentityComparator(IBindingIdentityFactory factory) {
|
||||
this.factory = factory;
|
||||
}
|
||||
|
||||
public int compare(IBinding a, IBinding b) throws CoreException {
|
||||
ICLocalBindingIdentity aID = (ICLocalBindingIdentity) factory.getLocalBindingIdentity(a);
|
||||
ICLocalBindingIdentity bID = (ICLocalBindingIdentity) factory.getLocalBindingIdentity(b);
|
||||
return compare(aID, bID);
|
||||
}
|
||||
|
||||
public int compare(ILocalBindingIdentity aID, IBinding b) throws CoreException {
|
||||
ICLocalBindingIdentity bID = (ICLocalBindingIdentity) factory.getLocalBindingIdentity(b);
|
||||
return compare((ICLocalBindingIdentity) aID, bID);
|
||||
}
|
||||
|
||||
public int compare(IBinding a, ILocalBindingIdentity bID) throws CoreException {
|
||||
ICLocalBindingIdentity aID = (ICLocalBindingIdentity) factory.getLocalBindingIdentity(a);
|
||||
return compare(aID, bID);
|
||||
}
|
||||
|
||||
public int compare(ILocalBindingIdentity aID, ILocalBindingIdentity bID) throws CoreException {
|
||||
return compare((ICLocalBindingIdentity) aID, (ICLocalBindingIdentity) bID);
|
||||
}
|
||||
|
||||
public int compare(ICLocalBindingIdentity aID, ICLocalBindingIdentity bID) throws CoreException {
|
||||
int cmp = CharArrayUtils.compare(aID.getNameCharArray(), bID.getNameCharArray());
|
||||
if(cmp!=0) return cmp;
|
||||
|
||||
int tyConA = aID.getTypeConstant();
|
||||
int tyConB = bID.getTypeConstant();
|
||||
if(tyConA != tyConB) {
|
||||
return tyConA < tyConB ? -1 : 1;
|
||||
}
|
||||
|
||||
cmp = aID.getExtendedType().compareTo(bID.getExtendedType());
|
||||
return cmp;
|
||||
}
|
||||
|
||||
public int compareNameAndConstOnly(IBinding a, char[] bName, int bConst) throws CoreException {
|
||||
ICLocalBindingIdentity aID = (ICLocalBindingIdentity) factory.getLocalBindingIdentity(a);
|
||||
|
||||
int cmp = CharArrayUtils.compare(aID.getNameCharArray(), bName);
|
||||
if(cmp!=0) {
|
||||
return cmp;
|
||||
}
|
||||
|
||||
int tyCon = aID.getTypeConstant();
|
||||
if(tyCon != bConst) {
|
||||
return tyCon < bConst ? -1 : 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* A factory for instances of binding identitys
|
||||
*/
|
||||
public interface IBindingIdentityFactory {
|
||||
/**
|
||||
* Return an IBindingIdentity instance for the named binding. No assumption
|
||||
* is made about whether the IBinding parameter is from the PDOM or DOM
|
||||
* @param binding the binding to create a IBindingIdentity for
|
||||
* @return a binding identity instance
|
||||
* @throws CoreException
|
||||
*/
|
||||
public ILocalBindingIdentity getLocalBindingIdentity(IBinding binding) throws CoreException;
|
||||
|
||||
/*
|
||||
* aftodo - we might want to introduce a true binding identity (i.e. identifies globally
|
||||
* not within a scope). I've no client code for this though.
|
||||
*
|
||||
* public IBindingIdentity getBindingIdentity(IBinding binding) throws CoreException
|
||||
*/
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* An IBindingIdentity instance uniquely defines a binding within a scope. Instances
|
||||
* are provided by an IBindingIdentityFactory and used by datastructures within the
|
||||
* PDOM to order binding records.
|
||||
*/
|
||||
public interface ICLocalBindingIdentity extends ILocalBindingIdentity {
|
||||
/**
|
||||
* Returns the constant associated with the coarse-grained type of the
|
||||
* associated IBinding
|
||||
* @return the constant associated with the coarse-grained type of the
|
||||
* associated IBinding
|
||||
* @throws CoreException
|
||||
*/
|
||||
public int getTypeConstant() throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns a String of unspecified format which uniquely identifies this
|
||||
* binding within its scope
|
||||
* @return
|
||||
* @throws CoreException
|
||||
*/
|
||||
public String getExtendedType() throws CoreException;
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* An ILocalBindingIdentity instance uniquely defines a binding within a scope.
|
||||
* <p>
|
||||
* All LocalBindingIdentity instances are required to order by name as the most significant
|
||||
* component, and then by any other information. This is for indexing purposes.
|
||||
*/
|
||||
public interface ILocalBindingIdentity {
|
||||
/**
|
||||
* Get the name of the binding this identity represents
|
||||
* @return the name of the binding this identity represents
|
||||
* @throws CoreException
|
||||
*/
|
||||
public char[] getNameCharArray() throws CoreException;
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.bid;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* A comparator for ILocalBindingIdentity objects
|
||||
*/
|
||||
public interface ILocalBindingIdentityComparator {
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @return -1 if a<b, 0 if a==b and 1 if a>b
|
||||
* @throws CoreException
|
||||
*/
|
||||
public int compare(IBinding a, IBinding b) throws CoreException;
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @return -1 if a<b, 0 if a==b and 1 if a>b
|
||||
* @throws CoreException
|
||||
*/
|
||||
public int compare(ILocalBindingIdentity a, IBinding b) throws CoreException;
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @return -1 if a<b, 0 if a==b and 1 if a>b
|
||||
* @throws CoreException
|
||||
*/
|
||||
public int compare(IBinding a, ILocalBindingIdentity b) throws CoreException;
|
||||
/**
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* @return -1 if a<b, 0 if a==b and 1 if a>b
|
||||
* @throws CoreException
|
||||
*/
|
||||
public int compare(ILocalBindingIdentity a, ILocalBindingIdentity b) throws CoreException;
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IString;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* Look up bindings in BTree objects and IPDOMNode objects
|
||||
*/
|
||||
public class FindBinding {
|
||||
public static class DefaultBindingBTreeComparator implements IBTreeComparator {
|
||||
protected PDOM pdom;
|
||||
public DefaultBindingBTreeComparator(PDOM pdom) {
|
||||
this.pdom = pdom;
|
||||
}
|
||||
public int compare(int record1, int record2) throws CoreException {
|
||||
IString nm1 = PDOMNamedNode.getDBName(pdom, record1);
|
||||
IString nm2 = PDOMNamedNode.getDBName(pdom, record2);
|
||||
return nm1.compare(nm2);
|
||||
}
|
||||
}
|
||||
|
||||
public static PDOMBinding findBinding(BTree btree, final PDOM pdom, final char[]name, final int[] constants) throws CoreException {
|
||||
final PDOMBinding[] result = new PDOMBinding[1];
|
||||
btree.accept(new IBTreeVisitor() {
|
||||
public int compare(int record) throws CoreException {
|
||||
IString nm1 = PDOMNamedNode.getDBName(pdom, record);
|
||||
return nm1.compare(name);
|
||||
}
|
||||
public boolean visit(int record) throws CoreException {
|
||||
result[0] = pdom.getBinding(record);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return result[0];
|
||||
}
|
||||
|
||||
public static PDOMBinding findBinding(IPDOMNode node, final PDOM pdom, final char[]name, final int[] constants) {
|
||||
final PDOMBinding[] result = new PDOMBinding[1];
|
||||
try {
|
||||
node.accept(new IPDOMVisitor() {
|
||||
public boolean visit(IPDOMNode node) throws CoreException {
|
||||
if(node instanceof PDOMNamedNode) {
|
||||
PDOMNamedNode nnode = (PDOMNamedNode) node;
|
||||
if(nnode.hasName(name)) {
|
||||
int constant = nnode.getNodeType();
|
||||
for(int i=0; i<constants.length; i++) {
|
||||
if(constant==constants[i]) {
|
||||
result[0] = (PDOMBinding) node;
|
||||
throw new CoreException(Status.OK_STATUS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false; /* do not visit children of node */
|
||||
}
|
||||
public void leave(IPDOMNode node) throws CoreException {}
|
||||
});
|
||||
} catch(CoreException ce) {
|
||||
if(ce.getStatus().getCode()==IStatus.OK) {
|
||||
return result[0];
|
||||
} else {
|
||||
CCorePlugin.log(ce);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2005, 2006 QNX Software Systems 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:
|
||||
* QNX - Initial API and implementation
|
||||
* Andrew Ferguson (Symbian)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.CLocalBindingIdentityComparator;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
public class FindBindingByLinkageConstant implements IBTreeVisitor, IPDOMVisitor {
|
||||
protected final char[] name;
|
||||
protected final int constant;
|
||||
protected final PDOMLinkage linkage;
|
||||
protected final CLocalBindingIdentityComparator bic;
|
||||
|
||||
protected PDOMBinding result;
|
||||
|
||||
public FindBindingByLinkageConstant(PDOMLinkage linkage, char[] name, int constant) {
|
||||
this.name = name;
|
||||
this.constant = constant;
|
||||
this.linkage = linkage;
|
||||
this.bic = new CLocalBindingIdentityComparator(linkage);
|
||||
}
|
||||
|
||||
public int compare(int record) throws CoreException {
|
||||
PDOMNode node = linkage.getNode(record);
|
||||
return CharArrayUtils.compare(
|
||||
((PDOMBinding)node).getNameCharArray(),
|
||||
name);
|
||||
}
|
||||
|
||||
public boolean visit(int record) throws CoreException {
|
||||
if(record!=0) {
|
||||
PDOMNode node = linkage.getNode(record);
|
||||
if(bic.compareNameAndConstOnly((PDOMBinding)node, name, constant)==0) {
|
||||
result = (PDOMBinding) node;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean visit(IPDOMNode node) throws CoreException {
|
||||
if(node!=null) {
|
||||
if(bic.compareNameAndConstOnly((PDOMBinding)node, name, constant)==0) {
|
||||
result = (PDOMBinding) node;
|
||||
throw new CoreException(Status.OK_STATUS); // TODO - why not just return false?
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void leave(IPDOMNode node) throws CoreException {/*NO-OP*/}
|
||||
|
||||
public PDOMBinding getResult() {
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.CLocalBindingIdentityComparator;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
public class FindEquivalentBinding implements IBTreeVisitor, IPDOMVisitor {
|
||||
|
||||
PDOMBinding result;
|
||||
PDOMLinkage linkage;
|
||||
ILocalBindingIdentity targetBID;
|
||||
CLocalBindingIdentityComparator cmp;
|
||||
|
||||
public FindEquivalentBinding(PDOMLinkage linkage, ILocalBindingIdentity target) throws CoreException {
|
||||
this.linkage = linkage;
|
||||
this.targetBID = target;
|
||||
this.cmp = new CLocalBindingIdentityComparator(linkage);
|
||||
}
|
||||
|
||||
public FindEquivalentBinding(PDOMLinkage linkage, IBinding target) throws CoreException {
|
||||
this.linkage = linkage;
|
||||
this.targetBID = linkage.getLocalBindingIdentity(target);
|
||||
this.cmp = new CLocalBindingIdentityComparator(linkage);
|
||||
}
|
||||
|
||||
public boolean visit(int record) throws CoreException {
|
||||
if(record!=0) {
|
||||
PDOMNode node = linkage.getNode(record);
|
||||
if(cmp.compare(targetBID, (IBinding) node)==0) {
|
||||
result = (PDOMBinding) node;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int compare(int record) throws CoreException {
|
||||
PDOMNode node = linkage.getNode(record);
|
||||
return cmp.compare((IBinding) node, targetBID);
|
||||
}
|
||||
|
||||
public boolean visit(IPDOMNode node) throws CoreException {
|
||||
if(node!=null && (node instanceof IBinding)) {
|
||||
if(cmp.compare(targetBID, (IBinding) node)==0) {
|
||||
result = (PDOMBinding) node;
|
||||
// aftodo - there is probably no performance reason not
|
||||
// to just return false here
|
||||
throw new CoreException(Status.OK_STATUS);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void leave(IPDOMNode node) throws CoreException {/*NO-OP*/}
|
||||
|
||||
public PDOMBinding getResult() {
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -191,12 +191,7 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
|
|||
abstract protected int getRecordSize(); // superclass's implementation is no longer valid
|
||||
|
||||
public String toString() {
|
||||
try {
|
||||
return getLinkageImpl().getLocalBindingIdentity(this).toString();
|
||||
} catch(CoreException ce) {
|
||||
CCorePlugin.log(ce);
|
||||
return super.toString();
|
||||
}
|
||||
return getName() + " " + getNodeType(); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -31,8 +31,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
|
|||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.CLocalBindingIdentityComparator;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.IBindingIdentityFactory;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||
|
@ -48,7 +46,7 @@ import org.eclipse.core.runtime.CoreException;
|
|||
* This class represents a collection of symbols that can be linked together at
|
||||
* link time. These are generally global symbols specific to a given language.
|
||||
*/
|
||||
public abstract class PDOMLinkage extends PDOMNamedNode implements IBindingIdentityFactory, IIndexLinkage {
|
||||
public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage {
|
||||
|
||||
// record offsets
|
||||
private static final int ID_OFFSET = PDOMNamedNode.RECORD_SIZE + 0;
|
||||
|
@ -157,16 +155,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IBindingIdent
|
|||
return node;
|
||||
}
|
||||
|
||||
public final IBTreeComparator getIndexComparator() {
|
||||
return new IBTreeComparator() {
|
||||
CLocalBindingIdentityComparator cmp = new CLocalBindingIdentityComparator(PDOMLinkage.this);
|
||||
public final int compare(int record1, int record2) throws CoreException {
|
||||
PDOMNode node1 = getNode(record1);
|
||||
PDOMNode node2 = getNode(record2);
|
||||
return cmp.compare((IBinding)node1,(IBinding)node2);
|
||||
}
|
||||
};
|
||||
}
|
||||
public abstract IBTreeComparator getIndexComparator();
|
||||
|
||||
public abstract PDOMBinding addBinding(IASTName name) throws CoreException;
|
||||
|
||||
|
@ -227,5 +216,5 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IBindingIdent
|
|||
return null;
|
||||
}
|
||||
|
||||
public abstract IBindingIdentityFactory getBindingIdentityFactory();
|
||||
public abstract int getBindingType(IBinding binding);
|
||||
}
|
||||
|
|
|
@ -54,6 +54,12 @@ public abstract class PDOMNamedNode extends PDOMNode {
|
|||
return db.getString(namerec);
|
||||
}
|
||||
|
||||
public static IString getDBName(PDOM pdom, int record) throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
int namerec = db.getInt(record + NAME);
|
||||
return db.getString(namerec);
|
||||
}
|
||||
|
||||
public char[] getNameCharArray() throws CoreException {
|
||||
return getDBName().getChars();
|
||||
}
|
||||
|
@ -87,5 +93,4 @@ public abstract class PDOMNamedNode extends PDOMNode {
|
|||
int mask = 1 << offset;
|
||||
return (bitVector & mask) == mask;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.AbstractCLocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
public class CBindingIdentity extends AbstractCLocalBindingIdentity {
|
||||
public CBindingIdentity(IBinding binding, PDOMLinkage linkage) {
|
||||
super(binding, linkage);
|
||||
}
|
||||
public int getTypeConstant() throws CoreException {
|
||||
if(binding instanceof PDOMBinding) {
|
||||
return ((PDOMBinding) binding).getNodeType();
|
||||
} else {
|
||||
return ((PDOMCLinkage)linkage).getBindingType(binding);
|
||||
}
|
||||
}
|
||||
|
||||
public String getExtendedType() throws CoreException {
|
||||
if(binding instanceof IFunction) {
|
||||
IFunction f = (IFunction) binding;
|
||||
try {
|
||||
String mangled = ASTTypeUtil.getParameterTypeString(f.getType());
|
||||
return mangled;
|
||||
} catch(DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
}
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
}
|
|
@ -36,17 +36,14 @@ import org.eclipse.cdt.core.dom.ast.c.ICBasicType;
|
|||
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
|
||||
import org.eclipse.cdt.core.model.ILanguage;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.IBindingIdentityFactory;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingByLinkageConstant;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindEquivalentBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
|
@ -148,7 +145,7 @@ class PDOMCLinkage extends PDOMLinkage {
|
|||
return pdomBinding;
|
||||
}
|
||||
|
||||
protected int getBindingType(IBinding binding) {
|
||||
public int getBindingType(IBinding binding) {
|
||||
if (binding instanceof IField)
|
||||
// This needs to be before variable
|
||||
return CFIELD;
|
||||
|
@ -178,23 +175,12 @@ class PDOMCLinkage extends PDOMLinkage {
|
|||
// so if the binding is from another pdom it has to be adapted.
|
||||
}
|
||||
|
||||
|
||||
FindEquivalentBinding visitor = new FindEquivalentBinding(this, binding);
|
||||
PDOMNode parent = getAdaptedParent(binding);
|
||||
|
||||
if (parent == this) {
|
||||
getIndex().accept(visitor);
|
||||
return visitor.getResult();
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), binding.getNameCharArray(), new int[] {getBindingType(binding)});
|
||||
} else if (parent instanceof IPDOMMemberOwner) {
|
||||
IPDOMMemberOwner owner = (IPDOMMemberOwner)parent;
|
||||
try {
|
||||
owner.accept(visitor);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS))
|
||||
return visitor.getResult();
|
||||
else
|
||||
throw e;
|
||||
}
|
||||
return FindBinding.findBinding(parent, getPDOM(), binding.getNameCharArray(), new int[] {getBindingType(binding)});
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -241,47 +227,25 @@ class PDOMCLinkage extends PDOMLinkage {
|
|||
} else if (parent instanceof ICASTElaboratedTypeSpecifier) {
|
||||
constant = CSTRUCTURE;
|
||||
} else if (parent instanceof IASTNamedTypeSpecifier){
|
||||
FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CSTRUCTURE);
|
||||
getIndex().accept(finder);
|
||||
PDOMBinding result = finder.getResult();
|
||||
if(result==null) {
|
||||
finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CENUMERATION);
|
||||
getIndex().accept(finder);
|
||||
result = finder.getResult();
|
||||
}
|
||||
if(result==null) {
|
||||
finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CTYPEDEF);
|
||||
getIndex().accept(finder);
|
||||
result = finder.getResult();
|
||||
}
|
||||
return result;
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), new int [] {CSTRUCTURE, CENUMERATION, CTYPEDEF});
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), constant);
|
||||
getIndex().accept(finder);
|
||||
return finder.getResult();
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), new int[] {constant});
|
||||
}
|
||||
|
||||
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
|
||||
if (type instanceof ICBasicType) {
|
||||
return new PDOMCBasicType(pdom, parent, (ICBasicType)type);
|
||||
} else if (type instanceof ICompositeType) {
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(this,(ICompositeType)type);
|
||||
getIndex().accept(feb);
|
||||
if(feb.getResult()!=null) {
|
||||
return feb.getResult();
|
||||
}
|
||||
ICompositeType ctype = (ICompositeType) type;
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), ctype.getNameCharArray(), new int[] {getBindingType(ctype)});
|
||||
}
|
||||
return super.addType(parent, type);
|
||||
}
|
||||
|
||||
public ILocalBindingIdentity getLocalBindingIdentity(IBinding b) throws CoreException {
|
||||
return new CBindingIdentity(b, this);
|
||||
}
|
||||
|
||||
public IBindingIdentityFactory getBindingIdentityFactory() {
|
||||
return this;
|
||||
public IBTreeComparator getIndexComparator() {
|
||||
return new FindBinding.DefaultBindingBTreeComparator(getPDOM());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,112 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.AbstractCLocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ICLocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
public class CPPBindingIdentity extends AbstractCLocalBindingIdentity {
|
||||
public CPPBindingIdentity(IBinding binding, PDOMLinkage linkage) {
|
||||
super(binding, linkage);
|
||||
}
|
||||
|
||||
public int getTypeConstant() throws CoreException {
|
||||
if(binding instanceof PDOMBinding) {
|
||||
return ((PDOMBinding) binding).getNodeType();
|
||||
} else {
|
||||
return ((PDOMCPPLinkage)linkage).getBindingType(binding);
|
||||
}
|
||||
}
|
||||
|
||||
public String getExtendedType() throws CoreException {
|
||||
try {
|
||||
if(binding instanceof ICPPFunction) {
|
||||
return renderFunctionType(((ICPPFunction)binding).getType());
|
||||
} else if(binding instanceof ICPPMethod) {
|
||||
return renderFunctionType(((ICPPMethod)binding).getType());
|
||||
} else {
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
} catch(DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
}
|
||||
|
||||
protected static String renderTypes(IType[] types) throws DOMException {
|
||||
if(types.length==1) {
|
||||
if(types[0] instanceof IBasicType) {
|
||||
if(((IBasicType)types[0]).getType()==IBasicType.t_void) {
|
||||
types = new IType[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
result.append('(');
|
||||
for(int i=0; i<types.length; i++) {
|
||||
if (i>0) {
|
||||
result.append(',');
|
||||
}
|
||||
result.append(ASTTypeUtil.getType(types[i]));
|
||||
}
|
||||
result.append(')');
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
private String renderFunctionType(IFunctionType type) throws DOMException {
|
||||
IType[] params = type.getParameterTypes();
|
||||
return renderTypes(params);
|
||||
}
|
||||
|
||||
public static class Holder implements ICLocalBindingIdentity {
|
||||
String name;
|
||||
int type;
|
||||
String mangledExtendedType;
|
||||
|
||||
public Holder(String name, int type, IType[] types) throws DOMException {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
mangledExtendedType = renderTypes(types);
|
||||
}
|
||||
|
||||
public int getTypeConstant() throws CoreException {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() throws CoreException {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getExtendedType() throws CoreException {
|
||||
return mangledExtendedType;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return name+" "+type+" "+mangledExtendedType; //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
||||
public char[] getNameCharArray() throws CoreException {
|
||||
return name.toCharArray();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,154 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IString;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* Look up bindings in BTree objects and IPDOMNode objects. This additionally
|
||||
* takes into account function/method parameters for overloading.
|
||||
*/
|
||||
public class CPPFindBinding extends FindBinding {
|
||||
public static PDOMBinding findBinding(BTree btree, final PDOM pdom, final char[]name, final int c2, final IType[] types) throws CoreException {
|
||||
final PDOMBinding[] result = new PDOMBinding[1];
|
||||
try {
|
||||
final int ty2 = PDOMCPPFunction.getSignatureMemento(types);
|
||||
btree.accept(new IBTreeVisitor() {
|
||||
public int compare(int record) throws CoreException {
|
||||
IString nm1 = PDOMNamedNode.getDBName(pdom, record);
|
||||
int cmp = nm1.compare(name);
|
||||
if(cmp==0) {
|
||||
int c1 = PDOMNode.getNodeType(pdom, record);
|
||||
cmp = c1 < c2 ? -1 : (c1 > c2 ? 1 : 0);
|
||||
if(cmp==0) {
|
||||
PDOMBinding binding = pdom.getBinding(record);
|
||||
if(binding instanceof PDOMCPPFunction) {
|
||||
int ty1 = ((PDOMCPPFunction)binding).getSignatureMemento();
|
||||
cmp = ty1 < ty2 ? -1 : (ty1 > ty2 ? 1 : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return cmp;
|
||||
}
|
||||
public boolean visit(int record) throws CoreException {
|
||||
result[0] = pdom.getBinding(record);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
}
|
||||
return result[0];
|
||||
}
|
||||
|
||||
|
||||
public static PDOMBinding findBinding(PDOMNode node, final PDOM pdom, final char[]name, final int constant, final IType[] types) {
|
||||
final PDOMBinding[] result = new PDOMBinding[1];
|
||||
try {
|
||||
final int ty2 = PDOMCPPFunction.getSignatureMemento(types);
|
||||
node.accept(new IPDOMVisitor() {
|
||||
public boolean visit(IPDOMNode binding) throws CoreException {
|
||||
if(binding instanceof PDOMNamedNode) {
|
||||
PDOMNamedNode nnode = (PDOMNamedNode) binding;
|
||||
if(nnode.hasName(name)) {
|
||||
if(nnode.getNodeType() == constant) {
|
||||
if(binding instanceof PDOMCPPFunction) {
|
||||
int ty1 = ((PDOMCPPFunction)binding).getSignatureMemento();
|
||||
if(ty1==ty2) {
|
||||
result[0] = (PDOMBinding) binding;
|
||||
throw new CoreException(Status.OK_STATUS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public void leave(IPDOMNode node) throws CoreException {}
|
||||
});
|
||||
} catch(CoreException ce) {
|
||||
if(ce.getStatus().getCode()==IStatus.OK) {
|
||||
return result[0];
|
||||
} else {
|
||||
CCorePlugin.log(ce);
|
||||
}
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static PDOMBinding findBinding(BTree btree, PDOMLinkage linkage, IBinding binding) throws CoreException {
|
||||
if(binding instanceof IFunction) {
|
||||
try {
|
||||
IFunctionType type = ((IFunction) binding).getType();
|
||||
return findBinding(btree, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), type.getParameterTypes());
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return findBinding(btree, linkage.getPDOM(), binding.getNameCharArray(), new int [] {linkage.getBindingType(binding)});
|
||||
}
|
||||
|
||||
|
||||
public static PDOMBinding findBinding(PDOMNode node, PDOMLinkage linkage, IBinding binding) {
|
||||
if(binding instanceof IFunction) {
|
||||
try {
|
||||
IFunctionType type = ((IFunction) binding).getType();
|
||||
return findBinding(node, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), type.getParameterTypes());
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return findBinding(node, linkage.getPDOM(), binding.getNameCharArray(), new int[] {linkage.getBindingType(binding)});
|
||||
}
|
||||
|
||||
public static class CPPBindingBTreeComparator extends FindBinding.DefaultBindingBTreeComparator {
|
||||
public CPPBindingBTreeComparator(PDOM pdom) {
|
||||
super(pdom);
|
||||
}
|
||||
public int compare(int record1, int record2) throws CoreException {
|
||||
int cmp = super.compare(record1, record2);
|
||||
if(cmp==0) {
|
||||
PDOMBinding binding1 = pdom.getBinding(record1);
|
||||
PDOMBinding binding2 = pdom.getBinding(record2);
|
||||
if(binding1 instanceof PDOMCPPFunction && binding2 instanceof PDOMCPPFunction) {
|
||||
int ty1 = ((PDOMCPPFunction)binding1).getSignatureMemento();
|
||||
int ty2 = ((PDOMCPPFunction)binding2).getSignatureMemento();
|
||||
cmp = ty1 < ty2 ? -1 : (ty1 > ty2 ? 1 : 0);
|
||||
}
|
||||
}
|
||||
return cmp;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -42,19 +42,16 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexProxyBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingByLinkageConstant;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindEquivalentBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
|
@ -388,21 +385,7 @@ ICPPClassScope, IPDOMMemberOwner {
|
|||
try {
|
||||
IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression());
|
||||
if(types!=null) {
|
||||
ILocalBindingIdentity bid = new CPPBindingIdentity.Holder(
|
||||
new String(name.toCharArray()),
|
||||
PDOMCPPLinkage.CPPFUNCTION,
|
||||
types);
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(getLinkageImpl(), bid);
|
||||
try {
|
||||
accept(feb);
|
||||
} catch(CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS)) {
|
||||
return feb.getResult();
|
||||
} else {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
return feb.getResult();
|
||||
return CPPFindBinding.findBinding(this, getPDOM(), name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION, types);
|
||||
}
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
|
@ -419,17 +402,7 @@ ICPPClassScope, IPDOMMemberOwner {
|
|||
}
|
||||
|
||||
private IBinding searchCurrentScope(char[] name, int constant) throws CoreException {
|
||||
FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(getLinkageImpl(), name, constant);
|
||||
try {
|
||||
accept(visitor);
|
||||
} catch(CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS)) {
|
||||
return visitor.getResult();
|
||||
} else {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return FindBinding.findBinding(this, getPDOM(), name, new int [] {constant});
|
||||
}
|
||||
|
||||
// Not implemented
|
||||
|
|
|
@ -13,7 +13,9 @@
|
|||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
|
@ -48,16 +50,21 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
|
|||
*/
|
||||
private static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4;
|
||||
|
||||
/**
|
||||
* Offset of hash of parameter information to allow fast comparison
|
||||
*/
|
||||
private static final int SIGNATURE_MEMENTO = PDOMBinding.RECORD_SIZE + 8;
|
||||
|
||||
/**
|
||||
* Offset of annotation information (relative to the beginning of the
|
||||
* record).
|
||||
*/
|
||||
private static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 8; // byte
|
||||
protected static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 12; // byte
|
||||
|
||||
/**
|
||||
* The size in bytes of a PDOMCPPFunction record in the database.
|
||||
*/
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 9;
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 13;
|
||||
|
||||
public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function) throws CoreException {
|
||||
super(pdom, parent, function.getNameCharArray());
|
||||
|
@ -72,6 +79,8 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
|
|||
setFirstParameter(new PDOMCPPParameter(pdom, this, params[i]));
|
||||
}
|
||||
db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(binding));
|
||||
IFunctionType ftype = function.getType();
|
||||
db.putInt(record + SIGNATURE_MEMENTO, getSignatureMemento(ftype.getParameterTypes()));
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -81,6 +90,14 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
|
|||
super(pdom, bindingRecord);
|
||||
}
|
||||
|
||||
public int getSignatureMemento() throws CoreException {
|
||||
return pdom.getDB().getInt(record + SIGNATURE_MEMENTO);
|
||||
}
|
||||
|
||||
public static int getSignatureMemento(PDOM pdom, int record) throws CoreException {
|
||||
return pdom.getDB().getInt(record + SIGNATURE_MEMENTO);
|
||||
}
|
||||
|
||||
protected int getRecordSize() {
|
||||
return RECORD_SIZE;
|
||||
}
|
||||
|
@ -201,4 +218,29 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFuncti
|
|||
throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
||||
public static int getSignatureMemento(IType[] types) throws DOMException {
|
||||
if(types.length==1) {
|
||||
if(types[0] instanceof IBasicType) {
|
||||
if(((IBasicType)types[0]).getType()==IBasicType.t_void) {
|
||||
types = new IType[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StringBuffer result = new StringBuffer();
|
||||
result.append('(');
|
||||
for(int i=0; i<types.length; i++) {
|
||||
if (i>0) {
|
||||
result.append(',');
|
||||
}
|
||||
result.append(ASTTypeUtil.getType(types[i]));
|
||||
}
|
||||
result.append(')');
|
||||
return result.toString().hashCode();
|
||||
}
|
||||
|
||||
public static int getSignatureMemento(IFunctionType type) throws DOMException {
|
||||
IType[] params = type.getParameterTypes();
|
||||
return getSignatureMemento(params);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,29 +56,26 @@ import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
|
|||
import org.eclipse.cdt.core.model.ILanguage;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.IBindingIdentityFactory;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingByLinkageConstant;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindEquivalentBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
*/
|
||||
class PDOMCPPLinkage extends PDOMLinkage {
|
||||
public class PDOMCPPLinkage extends PDOMLinkage {
|
||||
public PDOMCPPLinkage(PDOM pdom, int record) {
|
||||
super(pdom, record);
|
||||
}
|
||||
|
@ -211,7 +208,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
return pdomBinding;
|
||||
}
|
||||
|
||||
protected int getBindingType(IBinding binding) {
|
||||
public int getBindingType(IBinding binding) {
|
||||
if (binding instanceof ICPPTemplateDefinition)
|
||||
// this must be before class type
|
||||
return 0;
|
||||
|
@ -257,25 +254,14 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
// so if the binding is from another pdom it has to be adapted.
|
||||
}
|
||||
|
||||
FindEquivalentBinding visitor = new FindEquivalentBinding(this, binding);
|
||||
PDOMNode parent = getAdaptedParent(binding);
|
||||
|
||||
if (parent == this) {
|
||||
getIndex().accept(visitor);
|
||||
return visitor.getResult();
|
||||
return CPPFindBinding.findBinding(getIndex(), this, binding);
|
||||
} else if (parent instanceof IPDOMMemberOwner) {
|
||||
IPDOMMemberOwner owner = (IPDOMMemberOwner)parent;
|
||||
try {
|
||||
owner.accept(visitor);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS))
|
||||
return visitor.getResult();
|
||||
else
|
||||
throw e;
|
||||
}
|
||||
return CPPFindBinding.findBinding(parent, this, binding);
|
||||
} else if (parent instanceof PDOMCPPNamespace) {
|
||||
((PDOMCPPNamespace)parent).getIndex().accept(visitor);
|
||||
return visitor.getResult();
|
||||
return CPPFindBinding.findBinding(((PDOMCPPNamespace)parent).getIndex(), this, binding);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -344,13 +330,12 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
IASTExpression left = ((IASTBinaryExpression) epParent).getOperand1();
|
||||
IType type = CPPSemantics.getUltimateType(left.getExpressionType(), false);
|
||||
if (type instanceof IFunctionType) {
|
||||
ILocalBindingIdentity lbi = new CPPBindingIdentity.Holder(
|
||||
new String(name.toCharArray()),
|
||||
return CPPFindBinding.findBinding(getIndex(),
|
||||
getPDOM(),
|
||||
name.toCharArray(),
|
||||
CPPFUNCTION,
|
||||
((IFunctionType) type).getParameterTypes());
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(this, lbi);
|
||||
getIndex().accept(feb);
|
||||
return feb.getResult();
|
||||
((IFunctionType) type).getParameterTypes()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -387,17 +372,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
IType type = ((ICPPVariable)fieldOwnerBinding).getType();
|
||||
if(type instanceof ICompositeType) {
|
||||
PDOMBinding pdomFOB = adaptBinding( (ICompositeType) type);
|
||||
FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(this, name.toCharArray(), PDOMCPPLinkage.CPPFIELD);
|
||||
try {
|
||||
pdomFOB.accept(visitor);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS)) {
|
||||
return visitor.getResult();
|
||||
}
|
||||
else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return FindBinding.findBinding(pdomFOB, getPDOM(), name.toCharArray(), new int [] {PDOMCPPLinkage.CPPFIELD});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -417,12 +392,10 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
}
|
||||
|
||||
private PDOMBinding searchCurrentScope(char[] name, int constant) throws CoreException {
|
||||
FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(getLinkageImpl(), name, constant);
|
||||
getIndex().accept(visitor);
|
||||
return visitor.getResult();
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), name, new int [] {constant});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Read type information from the AST or null if the types could not be determined
|
||||
* @param paramExp the parameter expression to get types for (null indicates void function/method)
|
||||
|
@ -477,26 +450,19 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
IType[] types = getTypes(paramExp);
|
||||
if (types != null) {
|
||||
IBinding parentBinding = id.getName().getBinding();
|
||||
ILocalBindingIdentity bid = null;
|
||||
|
||||
if (parentBinding instanceof ICPPVariable) {
|
||||
|
||||
ICPPVariable v = (ICPPVariable) parentBinding;
|
||||
IType type = v.getType();
|
||||
if (type instanceof PDOMBinding) {
|
||||
bid = new CPPBindingIdentity.Holder(new String(name
|
||||
.toCharArray()), CPPMETHOD, types);
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(this,
|
||||
bid);
|
||||
try {
|
||||
((PDOMBinding) type).accept(feb);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS)) {
|
||||
return feb.getResult();
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return CPPFindBinding.findBinding(
|
||||
((PDOMBinding) type),
|
||||
getPDOM(),
|
||||
name.toCharArray(),
|
||||
CPPMETHOD,
|
||||
types
|
||||
);
|
||||
}
|
||||
} else {
|
||||
IASTNode expPNode = callExp.getParent();
|
||||
|
@ -508,31 +474,23 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
IASTExpression left = bExp.getOperand1();
|
||||
IType t = CPPSemantics.getUltimateType(left.getExpressionType(), false);
|
||||
if (t instanceof PDOMCPPClassType) {
|
||||
bid = new CPPBindingIdentity.Holder(
|
||||
new String(name.toCharArray()),
|
||||
return CPPFindBinding.findBinding(
|
||||
((PDOMCPPClassType) t),
|
||||
getPDOM(),
|
||||
name.toCharArray(),
|
||||
CPPMETHOD,
|
||||
types);
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(this, bid);
|
||||
try {
|
||||
((PDOMCPPClassType) t).accept(feb);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus().equals(Status.OK_STATUS)) {
|
||||
return feb.getResult();
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
types
|
||||
);
|
||||
}
|
||||
}
|
||||
} else { // filescope
|
||||
bid = new CPPBindingIdentity.Holder(
|
||||
new String(name.toCharArray()),
|
||||
return CPPFindBinding.findBinding(
|
||||
getIndex(),
|
||||
getPDOM(),
|
||||
name.toCharArray(),
|
||||
CPPFUNCTION,
|
||||
types);
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(this,bid);
|
||||
getIndex().accept(feb);
|
||||
return feb.getResult();
|
||||
types
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -549,19 +507,9 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
if(index!=-1) {
|
||||
if (index == 0) {
|
||||
// we are at the root
|
||||
FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(
|
||||
this, name.toCharArray(), CPPNAMESPACE);
|
||||
|
||||
getIndex().accept(finder);
|
||||
if (finder.getResult() == null) {
|
||||
finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPCLASSTYPE);
|
||||
getIndex().accept(finder);
|
||||
}
|
||||
if (finder.getResult() == null) {
|
||||
finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPNAMESPACEALIAS);
|
||||
getIndex().accept(finder);
|
||||
}
|
||||
return finder.getResult();
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), new int[]{
|
||||
CPPNAMESPACE, CPPCLASSTYPE, CPPNAMESPACEALIAS
|
||||
});
|
||||
} else {
|
||||
try {
|
||||
PDOMBinding binding = adaptBinding(names[index-1].getBinding());
|
||||
|
@ -638,11 +586,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
|||
}
|
||||
}
|
||||
|
||||
public ILocalBindingIdentity getLocalBindingIdentity(IBinding b) throws CoreException {
|
||||
return new CPPBindingIdentity(b, this);
|
||||
}
|
||||
|
||||
public IBindingIdentityFactory getBindingIdentityFactory() {
|
||||
return this;
|
||||
public IBTreeComparator getIndexComparator() {
|
||||
return new CPPFindBinding.CPPBindingBTreeComparator(pdom);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
|||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
|
@ -25,7 +24,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
|||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation;
|
||||
|
@ -33,38 +31,20 @@ import org.eclipse.core.runtime.CoreException;
|
|||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
*
|
||||
*/
|
||||
class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionType {
|
||||
class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod, ICPPFunctionType {
|
||||
|
||||
/**
|
||||
* Offset of total number of method parameters (relative to the
|
||||
* beginning of the record).
|
||||
* Offset of remaining annotation information (relative to the beginning of
|
||||
* the record).
|
||||
*/
|
||||
private static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0;
|
||||
|
||||
/**
|
||||
* Offset of pointer to the first parameter of this method (relative to
|
||||
* the beginning of the record).
|
||||
*/
|
||||
private static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4;
|
||||
private static final int ANNOTATION1 = PDOMCPPFunction.RECORD_SIZE; // byte
|
||||
|
||||
/**
|
||||
* Offset of first byte of annotation information (relative to the
|
||||
* beginning of the record).
|
||||
*/
|
||||
private static final int ANNOTATION0 = PDOMBinding.RECORD_SIZE + 8; // byte
|
||||
|
||||
/**
|
||||
* Offset of remaining annotation information (relative to the
|
||||
* beginning of the record).
|
||||
*/
|
||||
private static final int ANNOTATION1 = PDOMBinding.RECORD_SIZE + 9; // byte
|
||||
|
||||
/**
|
||||
* The size in bytes of a PDOMCPPMethod record in the database.
|
||||
*/
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 10;
|
||||
protected static final int RECORD_SIZE = PDOMCPPFunction.RECORD_SIZE + 1;
|
||||
|
||||
/**
|
||||
* The bit offset of CV qualifier flags within ANNOTATION1.
|
||||
|
@ -72,23 +52,16 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
private static final int CV_OFFSET = 2;
|
||||
|
||||
public PDOMCPPMethod(PDOM pdom, PDOMNode parent, ICPPMethod method) throws CoreException {
|
||||
super(pdom, parent, method.getNameCharArray());
|
||||
|
||||
super(pdom, parent, method);
|
||||
|
||||
Database db = pdom.getDB();
|
||||
|
||||
|
||||
try {
|
||||
IParameter[] params = method.getParameters();
|
||||
db.putInt(record + NUM_PARAMS, params.length);
|
||||
|
||||
for (int i=0; i<params.length; ++i) {
|
||||
setFirstParameter(new PDOMCPPParameter(pdom, this, params[i]));
|
||||
}
|
||||
ICPPFunctionType type = (ICPPFunctionType) method.getType();
|
||||
byte annotation = 0;
|
||||
annotation |= PDOMCAnnotation.encodeCVQualifiers(type) << CV_OFFSET;
|
||||
annotation |= PDOMCPPAnnotation.encodeExtraAnnotation(method);
|
||||
db.putByte(record + ANNOTATION0, PDOMCPPAnnotation.encodeAnnotation(method));
|
||||
db.putByte(record + ANNOTATION1, annotation);
|
||||
db.putByte(record + ANNOTATION1, annotation);
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -105,19 +78,7 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
public int getNodeType() {
|
||||
return PDOMCPPLinkage.CPPMETHOD;
|
||||
}
|
||||
|
||||
public PDOMCPPParameter getFirstParameter() throws CoreException {
|
||||
int rec = pdom.getDB().getInt(record + FIRST_PARAM);
|
||||
return rec != 0 ? new PDOMCPPParameter(pdom, rec) : null;
|
||||
}
|
||||
|
||||
public void setFirstParameter(PDOMCPPParameter param) throws CoreException {
|
||||
if (param != null)
|
||||
param.setNextParameter(getFirstParameter());
|
||||
int rec = param != null ? param.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + FIRST_PARAM, rec);
|
||||
}
|
||||
|
||||
public boolean isVirtual() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.VIRTUAL_OFFSET);
|
||||
}
|
||||
|
@ -130,26 +91,6 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
||||
public boolean isInline() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATION0), PDOMCAnnotation.INLINE_OFFSET);
|
||||
}
|
||||
|
||||
public IParameter[] getParameters() throws DOMException {
|
||||
try {
|
||||
int n = pdom.getDB().getInt(record + NUM_PARAMS);
|
||||
IParameter[] params = new IParameter[n];
|
||||
PDOMCPPParameter param = getFirstParameter();
|
||||
while (param != null) {
|
||||
params[--n] = param;
|
||||
param = param.getNextParameter();
|
||||
}
|
||||
return params;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return new IParameter[0];
|
||||
}
|
||||
}
|
||||
|
||||
public IScope getFunctionScope() throws DOMException {
|
||||
throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
@ -158,36 +99,28 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
return this;
|
||||
}
|
||||
|
||||
public boolean isStatic() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATION0), PDOMCAnnotation.STATIC_OFFSET);
|
||||
}
|
||||
|
||||
public boolean isExtern() throws DOMException {
|
||||
// ISO/IEC 14882:2003 9.2.6
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isAuto() throws DOMException {
|
||||
// ISO/IEC 14882:2003 9.2.6
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isRegister() throws DOMException {
|
||||
// ISO/IEC 14882:2003 9.2.6
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean takesVarArgs() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATION0), PDOMCAnnotation.VARARGS_OFFSET);
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getVisibility() throws DOMException {
|
||||
return PDOMCPPAnnotation.getVisibility(getByte(record + ANNOTATION0));
|
||||
return PDOMCPPAnnotation.getVisibility(getByte(record + ANNOTATION));
|
||||
}
|
||||
|
||||
public ICPPClassType getClassOwner() throws DOMException {
|
||||
try {
|
||||
return (ICPPClassType)getParentNode();
|
||||
return (ICPPClassType) getParentNode();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return null;
|
||||
|
@ -198,25 +131,9 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
||||
public IType[] getParameterTypes() throws DOMException {
|
||||
try {
|
||||
int n = pdom.getDB().getInt(record + NUM_PARAMS);
|
||||
IType[] types = new IType[n];
|
||||
PDOMCPPParameter param = getFirstParameter();
|
||||
while (param != null) {
|
||||
types[--n] = param.getType();
|
||||
param = param.getNextParameter();
|
||||
}
|
||||
return types;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return new IType[0];
|
||||
}
|
||||
}
|
||||
|
||||
public IType getReturnType() throws DOMException {
|
||||
return null;
|
||||
// TODO throw new PDOMNotImplementedError();
|
||||
// TODO throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
||||
public boolean isConst() {
|
||||
|
@ -231,7 +148,7 @@ class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionTy
|
|||
if (type == this)
|
||||
return true;
|
||||
if (type instanceof PDOMCPPMethod)
|
||||
return getRecord() == ((PDOMCPPMethod)type).getRecordSize();
|
||||
return getRecord() == ((PDOMCPPMethod) type).getRecordSize();
|
||||
// TODO further analysis to compare with DOM objects
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -27,13 +27,11 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingByLinkageConstant;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingsInBTree;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindEquivalentBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||
|
@ -176,10 +174,10 @@ implements ICPPNamespace, ICPPNamespaceScope {
|
|||
&& ((ICPPASTQualifiedName)name.getParent()).getLastName() != name)
|
||||
? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE;
|
||||
|
||||
IBinding result = searchCurrentScope(name.toCharArray(), desiredType);
|
||||
IBinding result = searchCurrentScope(name.toCharArray(), new int[] {desiredType});
|
||||
if(result!=null)
|
||||
return result;
|
||||
return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPTYPEDEF);
|
||||
return searchCurrentScope(name.toCharArray(), new int[] {PDOMCPPLinkage.CPPTYPEDEF});
|
||||
}
|
||||
} else if (parent instanceof IASTNamedTypeSpecifier) {
|
||||
return searchCurrentScope(name.toCharArray(), new int[] {
|
||||
|
@ -200,13 +198,7 @@ implements ICPPNamespace, ICPPNamespaceScope {
|
|||
try {
|
||||
IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression());
|
||||
if(types!=null) {
|
||||
ILocalBindingIdentity bid = new CPPBindingIdentity.Holder(
|
||||
new String(name.toCharArray()),
|
||||
PDOMCPPLinkage.CPPFUNCTION,
|
||||
types);
|
||||
FindEquivalentBinding feb = new FindEquivalentBinding(getLinkageImpl(), bid);
|
||||
getIndex().accept(feb);
|
||||
return feb.getResult();
|
||||
return CPPFindBinding.findBinding(getIndex(), getPDOM(), name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION, types);
|
||||
}
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
|
@ -215,16 +207,7 @@ implements ICPPNamespace, ICPPNamespaceScope {
|
|||
}
|
||||
|
||||
private PDOMBinding searchCurrentScope(char[] name, int[] constants) throws CoreException {
|
||||
PDOMBinding result = null;
|
||||
for(int i=0; result==null && i<constants.length; i++)
|
||||
result = searchCurrentScope(name, constants[i]);
|
||||
return result;
|
||||
}
|
||||
|
||||
private PDOMBinding searchCurrentScope(char[] name, int constant) throws CoreException {
|
||||
FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(getLinkageImpl(), name, constant);
|
||||
getIndex().accept(visitor);
|
||||
return visitor.getResult();
|
||||
return FindBinding.findBinding(getIndex(), getPDOM(), name, constants);
|
||||
}
|
||||
|
||||
public boolean isFullyCached() throws DOMException {
|
||||
|
|
Loading…
Add table
Reference in a new issue