mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Search for macro references, bug 156561.
This commit is contained in:
parent
db312ccd1b
commit
bb469b32ee
53 changed files with 1383 additions and 386 deletions
|
@ -145,7 +145,7 @@ public class LocationMapTests extends BaseTestCase {
|
|||
String filename, int offset, int length, int line, int endline, String sig) {
|
||||
assertSame(binding, name.getBinding());
|
||||
assertSame(binding, name.resolveBinding());
|
||||
assertEquals(Linkage.NO_LINKAGE, name.getLinkage());
|
||||
assertEquals(Linkage.CPP_LINKAGE, name.getLinkage());
|
||||
assertEquals(nameString, name.toString());
|
||||
checkASTNode(name, parent, property, filename, offset, length, line, endline, sig);
|
||||
assertEquals(name.isDeclaration(), role == IASTNameOwner.r_declaration);
|
||||
|
|
|
@ -79,6 +79,10 @@ public class EmptyIndexFragment implements IIndexFragment {
|
|||
return IIndexFragmentName.EMPTY_NAME_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
|
||||
public long getCacheHits() {
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Symbian Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 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
|
||||
|
@ -93,6 +93,7 @@ public class IndexProviderManagerTest extends IndexTestBase {
|
|||
return suite(IndexProviderManagerTest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
IndexProviderManager ipm= ((PDOMManager)CCorePlugin.getIndexManager()).getIndexProviderManager();
|
||||
ipm.reset(); ipm.startup();
|
||||
|
@ -526,7 +527,7 @@ class MockStateIndexFragmentProvider extends MockStateIndexProvider implements I
|
|||
|
||||
fragments = new IIndexFragment[MockState.states.size()];
|
||||
for(int i=0; i<MockState.states.size(); i++) {
|
||||
fragments[i] = new MockPDOM("mock.test.index."+System.identityHashCode(this)+"."+i, ""+PDOM.CURRENT_VERSION);
|
||||
fragments[i] = new MockPDOM("mock.test.index."+System.identityHashCode(this)+"."+i, ""+PDOM.MAJOR_VERSION+'.'+PDOM.MINOR_VERSION);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -726,6 +727,7 @@ class MockPDOM extends EmptyIndexFragment {
|
|||
this.version= version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProperty(String propertyName) throws CoreException {
|
||||
if(IIndexFragment.PROPERTY_FRAGMENT_ID.equals(propertyName)) {
|
||||
return id;
|
||||
|
@ -739,6 +741,7 @@ class MockPDOM extends EmptyIndexFragment {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[Mock index fragment "+id+"."+System.identityHashCode(this)+"]";
|
||||
}
|
||||
|
|
|
@ -351,22 +351,9 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
}
|
||||
|
||||
private IndexTypeReference createReference(IIndexMacro macro) throws CoreException {
|
||||
IIndexFileLocation ifl = macro.getFile().getLocation();
|
||||
String fullPath = ifl.getFullPath();
|
||||
if (fullPath != null) {
|
||||
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fullPath));
|
||||
if(file!=null) {
|
||||
return new IndexTypeReference(
|
||||
macro, file, file.getProject(), macro.getNodeOffset(), macro.getNodeLength()
|
||||
);
|
||||
}
|
||||
} else {
|
||||
IPath path = URIUtil.toPath(ifl.getURI());
|
||||
if(path!=null) {
|
||||
return new IndexTypeReference(
|
||||
macro, path, null, macro.getNodeOffset(), macro.getNodeLength()
|
||||
);
|
||||
}
|
||||
IIndexName def= macro.getDefinition();
|
||||
if (def != null) {
|
||||
return createReference(macro, def);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 QNX Software Systems and others.
|
||||
* Copyright (c) 2006, 2008 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
|
||||
|
@ -22,12 +22,14 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
|||
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
|
||||
/**
|
||||
|
@ -136,6 +138,9 @@ public class IndexModelUtil {
|
|||
if (binding instanceof IEnumerator) {
|
||||
elementType = ICElement.C_ENUMERATOR;
|
||||
}
|
||||
if (binding instanceof IMacroBinding || binding instanceof IIndexMacroContainer) {
|
||||
elementType= ICElement.C_MACRO;
|
||||
}
|
||||
return elementType;
|
||||
}
|
||||
|
||||
|
|
|
@ -260,6 +260,18 @@ public interface IIndex {
|
|||
*/
|
||||
public IIndexBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for all macro containers (one for macros with the same name) with names that
|
||||
* match the given pattern. In case a binding exists in multiple projects, no duplicate bindings
|
||||
* are returned.
|
||||
* @param pattern a pattern the name of the bindings have to match.
|
||||
* @param filter a filter that allows for skipping parts of the index
|
||||
* @param monitor a monitor to report progress, may be <code>null</code>
|
||||
* @return an array of bindings matching the pattern
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for all bindings in global scope with a given name. In case a binding exists in multiple projects, no duplicate bindings are returned.
|
||||
* This method makes use of the BTree and is faster than the methods using patterns.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -29,30 +29,25 @@ import org.eclipse.core.runtime.CoreException;
|
|||
*
|
||||
* @since 4.0
|
||||
*/
|
||||
public interface IIndexMacro extends IMacroBinding {
|
||||
public interface IIndexMacro extends IMacroBinding, IIndexBinding {
|
||||
|
||||
IIndexMacro[] EMPTY_INDEX_MACRO_ARRAY = new IIndexMacro[0];
|
||||
|
||||
/**
|
||||
* If available, return the file location for this macro definition
|
||||
* otherwise return null
|
||||
* @return
|
||||
* If available, return the file location for the macro definition of this macro,
|
||||
* otherwise return <code>null</code>.
|
||||
*/
|
||||
IASTFileLocation getFileLocation();
|
||||
|
||||
/**
|
||||
* Returns the file this macro belongs to.
|
||||
* Returns the file in which this macro is defined and belongs to.
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexFile getFile() throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns the character offset of the location of the name.
|
||||
*/
|
||||
public int getNodeOffset();
|
||||
|
||||
/**
|
||||
* Returns the length of the name.
|
||||
* Returns the name of the definition of this macro, or <code>null</code> if not available.
|
||||
* @since 5.0
|
||||
*/
|
||||
public int getNodeLength();
|
||||
IIndexName getDefinition();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, 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:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.index;
|
||||
|
||||
/**
|
||||
* Represents a binding for all macros with the same name. When you try to adapt a macro binding in an index
|
||||
* you'll get the container as a result.
|
||||
* @since 5.0
|
||||
*/
|
||||
public interface IIndexMacroContainer extends IIndexBinding {
|
||||
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -32,6 +32,8 @@ import org.eclipse.core.runtime.CoreException;
|
|||
* @since 4.0
|
||||
*/
|
||||
public interface IIndexName extends IName {
|
||||
IIndexName[] EMPTY_ARRAY= {};
|
||||
|
||||
/**
|
||||
* Returns the file the name belongs to.
|
||||
* @throws CoreException
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2006 IBM Corporation and others.
|
||||
* Copyright (c) 2004, 2008 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
|
||||
|
@ -10,9 +10,6 @@
|
|||
* Andrew Ferguson (Symbian)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
/*
|
||||
* Created on May 28, 2004
|
||||
*/
|
||||
package org.eclipse.cdt.core.parser.util;
|
||||
|
||||
/**
|
||||
|
@ -234,15 +231,16 @@ public class CharArrayUtils {
|
|||
return -1;
|
||||
}
|
||||
|
||||
public static int indexOf( char toBeFound, char[] buffer, int start, int len ) {
|
||||
if( start < 0 || start > buffer.length || start + len > buffer.length )
|
||||
public static int indexOf( char toBeFound, char[] buffer, int start, int end ) {
|
||||
if( start < 0 || start > buffer.length || end > buffer.length )
|
||||
return -1;
|
||||
|
||||
for (int i = start; i < len; i++)
|
||||
for (int i = start; i < end; i++)
|
||||
if (toBeFound == buffer[i])
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static final int indexOf( char[] toBeFound, char[] array ){
|
||||
if( toBeFound.length > array.length )
|
||||
return -1;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -8,10 +8,11 @@
|
|||
* Contributors:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.dom;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ILinkage;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
public class Linkage implements ILinkage {
|
||||
|
||||
|
@ -25,7 +26,17 @@ public class Linkage implements ILinkage {
|
|||
public static final ILinkage[] getAllLinkages() {
|
||||
return LINKAGES;
|
||||
}
|
||||
|
||||
|
||||
public static String getLinkageName(int linkageID) throws CoreException {
|
||||
switch(linkageID) {
|
||||
case NO_LINKAGE_ID: return NO_LINKAGE_NAME;
|
||||
case C_LINKAGE_ID: return C_LINKAGE_NAME;
|
||||
case CPP_LINKAGE_ID: return CPP_LINKAGE_NAME;
|
||||
case FORTRAN_LINKAGE_ID: return FORTRAN_LINKAGE_NAME;
|
||||
}
|
||||
throw new CoreException(CCorePlugin.createStatus("Unsupported linkage id: " + linkageID)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
private int fID;
|
||||
private String fName;
|
||||
private Linkage(int id, String name) {
|
||||
|
|
|
@ -119,6 +119,33 @@ public class CIndex implements IIndex {
|
|||
}
|
||||
}
|
||||
|
||||
public IIndexBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if(SPECIALCASE_SINGLES && fFragments.length==1) {
|
||||
return fFragments[0].findMacroContainers(pattern, filter, monitor);
|
||||
} else {
|
||||
List<IIndexBinding[]> result = new ArrayList<IIndexBinding[]>();
|
||||
ILinkage[] linkages = Linkage.getAllLinkages();
|
||||
for(int j=0; j < linkages.length; j++) {
|
||||
if(filter.acceptLinkage(linkages[j])) {
|
||||
IIndexFragmentBinding[][] fragmentBindings = new IIndexFragmentBinding[fPrimaryFragmentCount][];
|
||||
for (int i = 0; i < fPrimaryFragmentCount; i++) {
|
||||
try {
|
||||
IBinding[] part = fFragments[i].findMacroContainers(pattern, retargetFilter(linkages[j], filter), monitor);
|
||||
fragmentBindings[i] = new IIndexFragmentBinding[part.length];
|
||||
System.arraycopy(part, 0, fragmentBindings[i], 0, part.length);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
fragmentBindings[i] = IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
ICompositesFactory factory = getCompositesFactory(linkages[j].getLinkageID());
|
||||
result.add(factory.getCompositeBindings(fragmentBindings));
|
||||
}
|
||||
}
|
||||
return flatten(result);
|
||||
}
|
||||
}
|
||||
|
||||
public IIndexName[] findNames(IBinding binding, int flags) throws CoreException {
|
||||
LinkedList<IIndexFragmentName> result= new LinkedList<IIndexFragmentName>();
|
||||
if (binding instanceof ICPPUsingDeclaration) {
|
||||
|
|
|
@ -138,4 +138,8 @@ final public class EmptyCIndex implements IIndex {
|
|||
public IIndexBinding[] findBindings(char[] name, boolean fileScopeOnly, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
|
@ -17,5 +17,7 @@ public interface IIndexBindingConstants {
|
|||
int POINTER_TYPE= 1;
|
||||
int ARRAY_TYPE= 2;
|
||||
int QUALIFIER_TYPE= 3;
|
||||
int LAST_CONSTANT= QUALIFIER_TYPE;
|
||||
int MACRO_DEFINITION = 4;
|
||||
int MACRO_CONTAINER = 5;
|
||||
int LAST_CONSTANT= MACRO_CONTAINER;
|
||||
}
|
||||
|
|
|
@ -140,6 +140,19 @@ public interface IIndexFragment {
|
|||
*/
|
||||
IIndexFragmentBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for all macro containers (one for macros with the same name) with names that
|
||||
* match the given pattern. In case a binding exists in multiple projects, no duplicate bindings
|
||||
* are returned.
|
||||
* @param pattern a pattern the name of the bindings have to match.
|
||||
* @param filter a filter that allows for skipping parts of the index
|
||||
* @param monitor a monitor to report progress, may be <code>null</code>
|
||||
* @return an array of bindings matching the pattern
|
||||
* @throws CoreException
|
||||
*/
|
||||
IIndexFragmentBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
|
||||
/**
|
||||
* Searches for all bindings with qualified names that seen as an array of simple names equals
|
||||
* the given array of names.
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, 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:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite;
|
||||
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
|
||||
/**
|
||||
* Composite binding for macro containers.
|
||||
*
|
||||
* @since 5.0
|
||||
*/
|
||||
public class CompositeMacroContainer extends CompositeIndexBinding implements IIndexMacroContainer {
|
||||
public CompositeMacroContainer(ICompositesFactory cf, IIndexFragmentBinding rbinding) {
|
||||
super(cf, rbinding);
|
||||
}
|
||||
}
|
|
@ -29,12 +29,14 @@ import org.eclipse.cdt.core.dom.ast.IVariable;
|
|||
import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
|
||||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.AbstractCompositeFactory;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeArrayType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeFunctionType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositePointerType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeQualifierType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositingNotImplementedError;
|
||||
|
@ -120,6 +122,8 @@ public class CCompositesFactory extends AbstractCompositeFactory implements ICom
|
|||
result = new CompositeCEnumerator(this, rbinding);
|
||||
} else if(rbinding instanceof ITypedef) {
|
||||
result = new CompositeCTypedef(this, rbinding);
|
||||
} else if(rbinding instanceof IIndexMacroContainer) {
|
||||
result= new CompositeMacroContainer(this, rbinding);
|
||||
} else {
|
||||
throw new CompositingNotImplementedError("composite binding unavailable for "+rbinding+" "+rbinding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
|
|
@ -48,12 +48,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.index.CIndex;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.AbstractCompositeFactory;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeArrayType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositePointerType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeQualifierType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositingNotImplementedError;
|
||||
|
@ -154,6 +156,7 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC
|
|||
return index;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IIndexFragmentBinding findOneDefinition(IBinding binding) {
|
||||
return super.findOneDefinition(binding);
|
||||
}
|
||||
|
@ -266,6 +269,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC
|
|||
result = new CompositeCPPTypedef(this, (ICPPBinding) binding);
|
||||
} else if(binding instanceof ICPPTemplateTypeParameter) {
|
||||
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);
|
||||
} else if(binding instanceof IIndexMacroContainer) {
|
||||
result= new CompositeMacroContainer(this, binding);
|
||||
} else {
|
||||
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ public final class IndexProviderManager implements IElementChangedListener {
|
|||
* <b>Note: This method should not be called by clients for purposes other than testing</b>
|
||||
*/
|
||||
public void reset() {
|
||||
reset(new VersionRange("["+PDOM.MIN_SUPPORTED_VERSION+','+PDOM.CURRENT_VERSION+']')); //$NON-NLS-1$
|
||||
reset(new VersionRange(new Version(PDOM.MAJOR_VERSION,0, 0), true, new Version(PDOM.MAJOR_VERSION+1, 0, 0), false));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -43,7 +43,8 @@ class ASTPreprocessorName extends ASTPreprocessorNode implements IASTName {
|
|||
return fBinding;
|
||||
}
|
||||
public ILinkage getLinkage() {
|
||||
return Linkage.NO_LINKAGE;
|
||||
final IASTTranslationUnit tu= getTranslationUnit();
|
||||
return tu == null ? Linkage.NO_LINKAGE : tu.getLinkage();
|
||||
}
|
||||
public IASTCompletionContext getCompletionContext() {
|
||||
return null;
|
||||
|
|
|
@ -679,6 +679,10 @@ public class LocationMap implements ILocationResolver {
|
|||
return result.toArray(new IASTName[result.size()]);
|
||||
}
|
||||
|
||||
public IASTName[] getMacroReferences() {
|
||||
return fMacroReferences.toArray(new IASTName[fMacroReferences.size()]);
|
||||
}
|
||||
|
||||
public ASTPreprocessorName[] getNestedMacroReferences(ASTMacroExpansion expansion) {
|
||||
final IASTName explicitRef= expansion.getMacroReference();
|
||||
List<ASTPreprocessorName> result= new ArrayList<ASTPreprocessorName>();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -31,7 +31,6 @@ public class Messages extends NLS {
|
|||
public static String TeamPDOMExportOperation_errorWriteTempFile;
|
||||
public static String TeamPDOMExportOperation_subtaskCreateDatabase;
|
||||
public static String TeamPDOMExportOperation_taskExportIndex;
|
||||
public static String WritablePDOM_error_unknownLinkage;
|
||||
public static String AbstractIndexerTask_parsingFileTask;
|
||||
public static String AbstractIndexerTask_errorWhileParsing;
|
||||
public static String AbstractIndexerTask_tooManyIndexProblems;
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IField;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
|
@ -46,6 +47,7 @@ import org.eclipse.cdt.core.index.IIndexFileLocation;
|
|||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
import org.eclipse.cdt.core.index.IIndexLocationConverter;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
|
@ -62,13 +64,16 @@ import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
|||
import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.MacroCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerPatternCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.NamedNodeCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacroContainer;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacroReferenceName;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
|
@ -91,18 +96,16 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
*/
|
||||
public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$
|
||||
|
||||
public static final int CURRENT_VERSION = 56;
|
||||
public static final int MIN_SUPPORTED_VERSION= CURRENT_VERSION;
|
||||
public static int version(int major, int minor) {
|
||||
return major << 16 + minor;
|
||||
}
|
||||
|
||||
/**
|
||||
* The earliest PDOM version that the CURRENT_VERSION can be read as. For example,
|
||||
* versions 37,38 and 39 may be safely read by code from the version of CDT (4.0.0)
|
||||
* released at PDOM version 36.
|
||||
* <p>
|
||||
* Ideally this would always be CURRENT_VERSION on the basis that CURRENT_VERSION is
|
||||
* not incrementing.
|
||||
*/
|
||||
public static final int EARLIEST_FORWARD_COMPATIBLE_VERSION= CURRENT_VERSION;
|
||||
public static final int MAJOR_VERSION = 57;
|
||||
public static final int MINOR_VERSION = 0; // minor versions must be compatible
|
||||
|
||||
public static final int CURRENT_VERSION= version(MAJOR_VERSION, MINOR_VERSION);
|
||||
public static final int MIN_SUPPORTED_VERSION= version(MAJOR_VERSION, 0);
|
||||
public static final int MAX_SUPPORTED_VERSION= version(MAJOR_VERSION+1, 0)-1;
|
||||
|
||||
/*
|
||||
* PDOM internal format history
|
||||
|
@ -157,13 +160,13 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
* 54 - optimization of database size (bug 210392)
|
||||
* 55 - generalization of local bindings (bug 215783)
|
||||
* 56 - using directives (bug 216527)
|
||||
* 57.0 - macro references (bug 156561)
|
||||
*/
|
||||
|
||||
public static final int LINKAGES = Database.DATA_AREA;
|
||||
public static final int FILE_INDEX = Database.DATA_AREA + 4;
|
||||
public static final int PROPERTIES = Database.DATA_AREA + 8;
|
||||
public static final int MACRO_BTREE= Database.DATA_AREA + 12;
|
||||
public static final int END= Database.DATA_AREA + 16;
|
||||
public static final int END= Database.DATA_AREA + 12;
|
||||
static {
|
||||
assert END <= Database.CHUNK_SIZE;
|
||||
}
|
||||
|
@ -195,7 +198,6 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
// Local caches
|
||||
protected Database db;
|
||||
private BTree fileIndex;
|
||||
private BTree fMacroIndex= null;
|
||||
private Map<String, PDOMLinkage> fLinkageIDCache = new HashMap<String, PDOMLinkage>();
|
||||
private File fPath;
|
||||
private IIndexLocationConverter locationConverter;
|
||||
|
@ -225,13 +227,11 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
fPath= dbPath;
|
||||
final boolean lockDB= db == null || lockCount != 0;
|
||||
|
||||
clearCaches();
|
||||
db = new Database(fPath, cache, CURRENT_VERSION, isPermanentlyReadOnly());
|
||||
fileIndex= null; // holds on to the database, so clear it.
|
||||
fMacroIndex= null; // same here
|
||||
|
||||
db.setLocked(lockDB);
|
||||
int version= db.getVersion();
|
||||
if (version >= MIN_SUPPORTED_VERSION) {
|
||||
if (isSupportedVersion()) {
|
||||
readLinkages();
|
||||
}
|
||||
db.setLocked(lockCount != 0);
|
||||
|
@ -246,7 +246,8 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
}
|
||||
|
||||
public boolean isSupportedVersion() throws CoreException {
|
||||
return db.getVersion() >= MIN_SUPPORTED_VERSION;
|
||||
final int version = db.getVersion();
|
||||
return version >= MIN_SUPPORTED_VERSION && version <= MAX_SUPPORTED_VERSION;
|
||||
}
|
||||
|
||||
public void accept(IPDOMVisitor visitor) throws CoreException {
|
||||
|
@ -353,9 +354,12 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
}
|
||||
|
||||
public IIndexFragmentBinding findBinding(IASTName name) throws CoreException {
|
||||
PDOMLinkage linkage= adaptLinkage(name.getLinkage());
|
||||
if (linkage != null) {
|
||||
return linkage.resolveBinding(name);
|
||||
IBinding binding= name.resolveBinding();
|
||||
if (binding != null) {
|
||||
PDOMLinkage linkage= adaptLinkage(name.getLinkage());
|
||||
if (linkage != null) {
|
||||
return findBindingInLinkage(linkage, binding);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -461,6 +465,27 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
return finder.getBindings();
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if (monitor == null) {
|
||||
monitor= new NullProgressMonitor();
|
||||
}
|
||||
MacroContainerPatternCollector finder = new MacroContainerPatternCollector(this, pattern, monitor);
|
||||
for (Iterator<PDOMLinkage> iter = fLinkageIDCache.values().iterator(); iter.hasNext();) {
|
||||
PDOMLinkage linkage = iter.next();
|
||||
if (filter.acceptLinkage(linkage)) {
|
||||
try {
|
||||
linkage.getMacroIndex().accept(finder);
|
||||
} catch (CoreException e) {
|
||||
if (e.getStatus() != Status.OK_STATUS)
|
||||
throw e;
|
||||
else
|
||||
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
}
|
||||
return finder.getMacroContainers();
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding[] findBindings(char[][] names, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if (names.length == 0) {
|
||||
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
|
@ -688,18 +713,25 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
if (binding == null) {
|
||||
return null;
|
||||
}
|
||||
PDOMBinding pdomBinding= (PDOMBinding) binding.getAdapter(PDOMBinding.class);
|
||||
if (pdomBinding != null && pdomBinding.getPDOM() == this) {
|
||||
return pdomBinding;
|
||||
PDOMNode pdomNode= (PDOMNode) binding.getAdapter(PDOMNode.class);
|
||||
if (pdomNode instanceof IIndexFragmentBinding && pdomNode.getPDOM() == this) {
|
||||
return (IIndexFragmentBinding) pdomNode;
|
||||
}
|
||||
|
||||
PDOMLinkage linkage= adaptLinkage(binding.getLinkage());
|
||||
if (linkage != null) {
|
||||
return linkage.adaptBinding(binding);
|
||||
return findBindingInLinkage(linkage, binding);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private IIndexFragmentBinding findBindingInLinkage(PDOMLinkage linkage, IBinding binding) throws CoreException {
|
||||
if (binding instanceof IMacroBinding || binding instanceof IIndexMacroContainer) {
|
||||
return linkage.findMacroContainer(binding.getNameCharArray());
|
||||
}
|
||||
return linkage.adaptBinding(binding);
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding findBinding(IIndexFragmentName indexName) throws CoreException {
|
||||
if (indexName instanceof PDOMName) {
|
||||
PDOMName pdomName= (PDOMName) indexName;
|
||||
|
@ -709,22 +741,25 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
}
|
||||
|
||||
public IIndexFragmentName[] findNames(IBinding binding, int options) throws CoreException {
|
||||
ArrayList<PDOMName> names= new ArrayList<PDOMName>();
|
||||
PDOMBinding pdomBinding = (PDOMBinding) adaptBinding(binding);
|
||||
if (pdomBinding != null) {
|
||||
names= new ArrayList<PDOMName>();
|
||||
ArrayList<IIndexFragmentName> names= new ArrayList<IIndexFragmentName>();
|
||||
IIndexFragmentBinding myBinding= adaptBinding(binding);
|
||||
if (myBinding instanceof PDOMBinding) {
|
||||
PDOMBinding pdomBinding = (PDOMBinding) myBinding;
|
||||
findNamesForMyBinding(pdomBinding, options, names);
|
||||
}
|
||||
if ((options & SEARCH_ACCROSS_LANGUAGE_BOUNDARIES) != 0) {
|
||||
PDOMBinding[] xlangBindings= getCrossLanguageBindings(binding);
|
||||
for (int j = 0; j < xlangBindings.length; j++) {
|
||||
findNamesForMyBinding(xlangBindings[j], options, names);
|
||||
if ((options & SEARCH_ACCROSS_LANGUAGE_BOUNDARIES) != 0) {
|
||||
PDOMBinding[] xlangBindings= getCrossLanguageBindings(binding);
|
||||
for (int j = 0; j < xlangBindings.length; j++) {
|
||||
findNamesForMyBinding(xlangBindings[j], options, names);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (myBinding instanceof PDOMMacroContainer) {
|
||||
findNamesForMyBinding((PDOMMacroContainer) myBinding, options, names);
|
||||
}
|
||||
return names.toArray(new IIndexFragmentName[names.size()]);
|
||||
}
|
||||
|
||||
private void findNamesForMyBinding(PDOMBinding pdomBinding, int options, ArrayList<PDOMName> names)
|
||||
private void findNamesForMyBinding(PDOMBinding pdomBinding, int options, ArrayList<IIndexFragmentName> names)
|
||||
throws CoreException {
|
||||
PDOMName name;
|
||||
if ((options & FIND_DECLARATIONS) != 0) {
|
||||
|
@ -744,6 +779,20 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
}
|
||||
}
|
||||
|
||||
private void findNamesForMyBinding(PDOMMacroContainer container, int options, ArrayList<IIndexFragmentName> names)
|
||||
throws CoreException {
|
||||
if ((options & FIND_DEFINITIONS) != 0) {
|
||||
for (PDOMMacro macro= container.getFirstDefinition(); macro != null; macro= macro.getNextInContainer()) {
|
||||
names.add(macro.getDefinition());
|
||||
}
|
||||
}
|
||||
if ((options & FIND_REFERENCES) != 0) {
|
||||
for (PDOMMacroReferenceName name = container.getFirstReference(); name != null; name= name.getNextInContainer()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file) throws CoreException {
|
||||
PDOMFile pdomFile= adaptFile(file);
|
||||
if (pdomFile != null) {
|
||||
|
@ -822,38 +871,31 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
|
||||
public IIndexMacro[] findMacros(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
ArrayList<IIndexMacro> result= new ArrayList<IIndexMacro>();
|
||||
MacroCollector visitor = new MacroCollector(this, prefix, isPrefix, isCaseSensitive);
|
||||
MacroContainerCollector visitor = new MacroContainerCollector(this, prefix, isPrefix, isCaseSensitive);
|
||||
visitor.setMonitor(monitor);
|
||||
try {
|
||||
getMacroIndex().accept(visitor);
|
||||
result.addAll(visitor.getMacroList());
|
||||
for (Iterator<PDOMLinkage> iter = fLinkageIDCache.values().iterator(); iter.hasNext();) {
|
||||
PDOMLinkage linkage = iter.next();
|
||||
if (filter.acceptLinkage(linkage)) {
|
||||
linkage.getMacroIndex().accept(visitor);
|
||||
}
|
||||
}
|
||||
for (PDOMMacroContainer mcont : visitor.getMacroList()) {
|
||||
result.addAll(Arrays.asList(mcont.getDefinitions()));
|
||||
}
|
||||
}
|
||||
catch (OperationCanceledException e) {
|
||||
}
|
||||
return result.toArray(new IIndexMacro[result.size()]);
|
||||
}
|
||||
|
||||
private BTree getMacroIndex() {
|
||||
if (fMacroIndex == null) {
|
||||
fMacroIndex= new BTree(db, MACRO_BTREE, new FindBinding.MacroBTreeComparator(this));
|
||||
}
|
||||
return fMacroIndex;
|
||||
}
|
||||
|
||||
public void afterAddMacro(PDOMMacro macro) throws CoreException {
|
||||
getMacroIndex().insert(macro.getRecord());
|
||||
}
|
||||
|
||||
public void beforeRemoveMacro(PDOMMacro macro) throws CoreException {
|
||||
getMacroIndex().delete(macro.getRecord());
|
||||
}
|
||||
|
||||
public String getProperty(String propertyName) throws CoreException {
|
||||
if(IIndexFragment.PROPERTY_FRAGMENT_FORMAT_ID.equals(propertyName)) {
|
||||
return FRAGMENT_PROPERTY_VALUE_FORMAT_ID;
|
||||
}
|
||||
if(IIndexFragment.PROPERTY_FRAGMENT_FORMAT_VERSION.equals(propertyName)) {
|
||||
return ""+db.getVersion(); //$NON-NLS-1$
|
||||
int version= db.getVersion();
|
||||
return ""+(version >> 16) + '.' + (version & 0xffff); //$NON-NLS-1$
|
||||
}
|
||||
return new DBProperties(db, PROPERTIES).getProperty(propertyName);
|
||||
}
|
||||
|
@ -865,7 +907,6 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
|
||||
private void clearCaches() {
|
||||
fileIndex= null;
|
||||
fMacroIndex= null;
|
||||
fLinkageIDCache.clear();
|
||||
clearResultCache();
|
||||
}
|
||||
|
@ -892,9 +933,9 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
db.flush();
|
||||
}
|
||||
|
||||
public Object getCachedResult(Object binding) {
|
||||
public Object getCachedResult(Object key) {
|
||||
synchronized(fResultCache) {
|
||||
return fResultCache.get(binding);
|
||||
return fResultCache.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -905,7 +946,7 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
}
|
||||
|
||||
public String createKeyForCache(int record, char[] name) {
|
||||
return new StringBuffer(name.length+2).append((char) (record >> 16)).append((char) record).append(name).toString();
|
||||
return new StringBuilder(name.length+2).append((char) (record >> 16)).append((char) record).append(name).toString();
|
||||
}
|
||||
|
||||
private PDOMBinding[] getCrossLanguageBindings(IBinding binding) throws CoreException {
|
||||
|
|
|
@ -240,4 +240,15 @@ public class PDOMProxy implements IPDOM {
|
|||
return fDelegate.getAllFiles();
|
||||
return IIndexFragmentFile.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.IIndexFragment#findMacroContainers(java.util.regex.Pattern, org.eclipse.cdt.core.index.IndexFilter, org.eclipse.core.runtime.IProgressMonitor)
|
||||
*/
|
||||
public synchronized IIndexFragmentBinding[] findMacroContainers(Pattern pattern, IndexFilter filter,
|
||||
IProgressMonitor monitor) throws CoreException {
|
||||
if (fDelegate != null) {
|
||||
return fDelegate.findMacroContainers(pattern, filter, monitor);
|
||||
}
|
||||
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
|
|||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||
import org.eclipse.cdt.internal.core.index.IWritableIndex.IncludeInformation;
|
||||
import org.eclipse.cdt.internal.core.parser.scanner.LocationMap;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
||||
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerASTVisitor;
|
||||
|
@ -62,7 +63,8 @@ import org.eclipse.osgi.util.NLS;
|
|||
*/
|
||||
abstract public class PDOMWriter {
|
||||
public static int SKIP_ALL_REFERENCES= -1;
|
||||
public static int SKIP_TYPE_REFERENCES= 1;
|
||||
public static int SKIP_TYPE_REFERENCES= 1;
|
||||
public static int SKIP_MACRO_REFERENCES= 2;
|
||||
public static int SKIP_NO_REFERENCES= 0;
|
||||
|
||||
private static class Symbols {
|
||||
|
@ -108,7 +110,8 @@ abstract public class PDOMWriter {
|
|||
|
||||
/**
|
||||
* Determines whether references are skipped or not. Provide one of
|
||||
* {@link #SKIP_ALL_REFERENCES}, {@link #SKIP_TYPE_REFERENCES} or {@link #SKIP_NO_REFERENCES}.
|
||||
* {@link #SKIP_ALL_REFERENCES}, {@link #SKIP_NO_REFERENCES} or a combination of
|
||||
* {@link #SKIP_TYPE_REFERENCES} or {@link #SKIP_MACRO_REFERENCES}.
|
||||
*/
|
||||
public void setSkipReferences(int options) {
|
||||
fSkipReferences= options;
|
||||
|
@ -335,6 +338,20 @@ abstract public class PDOMWriter {
|
|||
};
|
||||
ast.accept(visitor);
|
||||
|
||||
if ((fSkipReferences & SKIP_MACRO_REFERENCES) == 0) {
|
||||
LocationMap lm= (LocationMap) ast.getAdapter(LocationMap.class);
|
||||
if (lm != null) {
|
||||
IASTName[] refs= lm.getMacroReferences();
|
||||
for (IASTName name : refs) {
|
||||
IASTFileLocation nameLoc = name.getFileLocation();
|
||||
if (nameLoc != null) {
|
||||
IIndexFileLocation location = fResolver.resolveASTPath(nameLoc.getFileName());
|
||||
addToMap(symbolMap, location, new IASTName[]{name, null});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fStatistics.fUnresolvedIncludesCount += unresolvedIncludes;
|
||||
fStatistics.fPreprocessorProblemCount+= ast.getPreprocessorProblemsCount() - unresolvedIncludes;
|
||||
if (fShowScannerProblems || fShowInclusionProblems) {
|
||||
|
|
|
@ -12,14 +12,12 @@
|
|||
package org.eclipse.cdt.internal.core.pdom;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
|
@ -32,9 +30,7 @@ import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
|
|||
import org.eclipse.cdt.internal.core.pdom.db.DBProperties;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
public class WritablePDOM extends PDOM implements IWritableIndexFragment {
|
||||
|
@ -96,19 +92,7 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
|
|||
public void flush() throws CoreException {
|
||||
super.flush();
|
||||
}
|
||||
|
||||
public PDOMBinding addBinding(IASTName name) throws CoreException {
|
||||
PDOMBinding result= null;
|
||||
PDOMLinkage linkage= createLinkage(name.getLinkage().getLinkageName());
|
||||
if (linkage == null) {
|
||||
CCorePlugin.log(MessageFormat.format(Messages.WritablePDOM_error_unknownLinkage, new Object[]{name.getLinkage()}));
|
||||
}
|
||||
else {
|
||||
result= linkage.addBinding(name);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.IWritableIndexFragment#setProperty(java.lang.String, java.lang.String)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 QNX Software Systems and others.
|
||||
* Copyright (c) 2006, 2008 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
|
||||
|
@ -41,6 +41,7 @@ public final class BindingCollector extends NamedNodeCollector {
|
|||
this.filter= filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addNode(PDOMNamedNode tBinding) throws CoreException {
|
||||
if (tBinding instanceof PDOMBinding) {
|
||||
if (filter == null || filter.acceptBinding((IBinding) tBinding)) {
|
||||
|
@ -51,7 +52,7 @@ public final class BindingCollector extends NamedNodeCollector {
|
|||
}
|
||||
|
||||
public PDOMBinding[] getBindings() {
|
||||
List bindings= getNodeList();
|
||||
return (PDOMBinding[])bindings.toArray(new PDOMBinding[bindings.size()]);
|
||||
List<PDOMNamedNode> bindings= getNodeList();
|
||||
return bindings.toArray(new PDOMBinding[bindings.size()]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -123,6 +123,7 @@ public class FindBinding {
|
|||
super(linkage.pdom);
|
||||
this.linkage= linkage;
|
||||
}
|
||||
@Override
|
||||
public int compare(int record1, int record2) throws CoreException {
|
||||
int cmp= super.compare(record1, record2); // compare names
|
||||
if (cmp==0) { // any order will do.
|
||||
|
@ -144,16 +145,7 @@ public class FindBinding {
|
|||
fPDom= pdom;
|
||||
}
|
||||
public int compare(int record1, int record2) throws CoreException {
|
||||
int cmp= compare(PDOMMacro.getNameInDB(fPDom, record1), PDOMMacro.getNameInDB(fPDom, record2)); // compare names
|
||||
if (cmp==0) { // any order will do.
|
||||
if (record1 < record2) {
|
||||
return -1;
|
||||
}
|
||||
else if (record1 > record2) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return cmp;
|
||||
return compare(PDOMNamedNode.getDBName(fPDom, record1), PDOMNamedNode.getDBName(fPDom, record2)); // compare names
|
||||
}
|
||||
private int compare(IString nameInDB, IString nameInDB2) throws CoreException {
|
||||
return nameInDB.compareCompatibleWithIgnoreCase(nameInDB2);
|
||||
|
|
|
@ -24,7 +24,7 @@ import org.eclipse.core.runtime.OperationCanceledException;
|
|||
* Visitor to find macros in a BTree.
|
||||
* @since 4.0.2
|
||||
*/
|
||||
public final class MacroCollector implements IBTreeVisitor {
|
||||
public final class MacroContainerCollector implements IBTreeVisitor {
|
||||
private final PDOM pdom;
|
||||
private final char[] name;
|
||||
private final boolean prefixLookup;
|
||||
|
@ -32,14 +32,14 @@ public final class MacroCollector implements IBTreeVisitor {
|
|||
private IProgressMonitor monitor= null;
|
||||
private int monitorCheckCounter= 0;
|
||||
|
||||
private List<PDOMMacro> macros = new ArrayList<PDOMMacro>();
|
||||
private List<PDOMMacroContainer> macros = new ArrayList<PDOMMacroContainer>();
|
||||
|
||||
|
||||
/**
|
||||
* Collects all nodes with given name, passing the filter. If prefixLookup is set to
|
||||
* <code>true</code> a binding is considered if its name starts with the given prefix.
|
||||
*/
|
||||
public MacroCollector(PDOM pdom, char[] name, boolean prefixLookup, boolean caseSensitive) {
|
||||
public MacroContainerCollector(PDOM pdom, char[] name, boolean prefixLookup, boolean caseSensitive) {
|
||||
this.name= name;
|
||||
this.pdom= pdom;
|
||||
this.prefixLookup= prefixLookup;
|
||||
|
@ -57,7 +57,7 @@ public final class MacroCollector implements IBTreeVisitor {
|
|||
final public int compare(int record) throws CoreException {
|
||||
if (monitor != null)
|
||||
checkCancelled();
|
||||
IString name= PDOMMacro.getNameInDB(pdom, record);
|
||||
IString name= PDOMNamedNode.getDBName(pdom, record);
|
||||
return compare(name);
|
||||
}
|
||||
|
||||
|
@ -87,11 +87,11 @@ public final class MacroCollector implements IBTreeVisitor {
|
|||
if (record == 0)
|
||||
return true;
|
||||
|
||||
macros.add(new PDOMMacro(pdom, record));
|
||||
macros.add(new PDOMMacroContainer(pdom, record));
|
||||
return true; // look for more
|
||||
}
|
||||
|
||||
final public List<PDOMMacro> getMacroList() {
|
||||
final public List<PDOMMacroContainer> getMacroList() {
|
||||
return macros;
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, 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:
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IString;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* Visitor to find a macro container in a BTree.
|
||||
*/
|
||||
public final class MacroContainerFinder implements IBTreeVisitor {
|
||||
private final PDOM fPdom;
|
||||
private final char[] fName;
|
||||
private PDOMMacroContainer fMacroContainer;
|
||||
|
||||
/**
|
||||
* Collects all nodes with given name, passing the filter. If prefixLookup is set to
|
||||
* <code>true</code> a binding is considered if its name starts with the given prefix.
|
||||
*/
|
||||
public MacroContainerFinder(PDOM pdom, char[] name) {
|
||||
fName= name;
|
||||
fPdom= pdom;
|
||||
}
|
||||
|
||||
final public int compare(int record) throws CoreException {
|
||||
IString name= PDOMNamedNode.getDBName(fPdom, record);
|
||||
return compare(name);
|
||||
}
|
||||
|
||||
private int compare(IString rhsName) throws CoreException {
|
||||
return rhsName.compareCompatibleWithIgnoreCase(fName);
|
||||
}
|
||||
|
||||
final public boolean visit(int record) throws CoreException {
|
||||
if (record == 0)
|
||||
return true;
|
||||
fMacroContainer= new PDOMMacroContainer(fPdom, record);
|
||||
return false; // we are done.
|
||||
}
|
||||
|
||||
final public PDOMMacroContainer getMacroContainer() {
|
||||
return fMacroContainer;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007, 2008 Wind River Systems, 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:
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.OperationCanceledException;
|
||||
|
||||
/**
|
||||
* Visitor to find macros in a BTree.
|
||||
* @since 4.0.2
|
||||
*/
|
||||
public final class MacroContainerPatternCollector implements IBTreeVisitor {
|
||||
private final PDOM fPDOM;
|
||||
|
||||
private final List<PDOMMacroContainer> macros = new ArrayList<PDOMMacroContainer>();
|
||||
private final Pattern fPattern;
|
||||
private final IProgressMonitor fMonitor;
|
||||
private int fMonitorCheckCounter= 0;
|
||||
|
||||
|
||||
public MacroContainerPatternCollector(PDOM pdom, Pattern pattern, IProgressMonitor monitor) {
|
||||
fPDOM= pdom;
|
||||
fPattern= pattern;
|
||||
fMonitor= monitor;
|
||||
}
|
||||
|
||||
|
||||
final public int compare(int record) throws CoreException {
|
||||
if (fMonitor != null)
|
||||
checkCancelled();
|
||||
return 0;
|
||||
}
|
||||
|
||||
final public boolean visit(int record) throws CoreException {
|
||||
if (record == 0)
|
||||
return true;
|
||||
|
||||
String name= PDOMNamedNode.getDBName(fPDOM, record).getString();
|
||||
if (fPattern.matcher(name).matches()) {
|
||||
macros.add(new PDOMMacroContainer(fPDOM, record));
|
||||
}
|
||||
return true; // look for more
|
||||
}
|
||||
|
||||
final public PDOMMacroContainer[] getMacroContainers() {
|
||||
return macros.toArray(new PDOMMacroContainer[macros.size()]);
|
||||
}
|
||||
|
||||
private void checkCancelled() {
|
||||
if (++fMonitorCheckCounter % 0x1000 == 0 && fMonitor.isCanceled()) {
|
||||
throw new OperationCanceledException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
|||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
||||
import org.eclipse.cdt.internal.core.index.ArrayTypeClone;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
|
@ -27,6 +28,7 @@ import org.eclipse.core.runtime.CoreException;
|
|||
public class PDOMArrayType extends PDOMNode implements IIndexType, IArrayType, ITypeContainer {
|
||||
|
||||
private static final int TYPE = PDOMNode.RECORD_SIZE;
|
||||
@SuppressWarnings("hiding")
|
||||
private static final int RECORD_SIZE= TYPE+4;
|
||||
|
||||
public PDOMArrayType(PDOM pdom, int record) {
|
||||
|
@ -48,12 +50,14 @@ public class PDOMArrayType extends PDOMNode implements IIndexType, IArrayType, I
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRecordSize() {
|
||||
return RECORD_SIZE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNodeType() {
|
||||
return PDOMLinkage.ARRAY_TYPE;
|
||||
return IIndexBindingConstants.ARRAY_TYPE;
|
||||
}
|
||||
|
||||
public IASTExpression getArraySizeExpression() throws DOMException {
|
||||
|
@ -93,10 +97,12 @@ public class PDOMArrayType extends PDOMNode implements IIndexType, IArrayType, I
|
|||
throw new PDOMNotImplementedError();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() {
|
||||
return new ArrayTypeClone(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(PDOMLinkage linkage) throws CoreException {
|
||||
linkage.deleteType(getType(), record);
|
||||
super.delete(linkage);
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexFileSet;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBindingComparator;
|
||||
|
@ -81,6 +82,7 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
|
|||
&& db.getInt(record + FIRST_REF_OFFSET) == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRecord() {
|
||||
return record;
|
||||
}
|
||||
|
@ -174,13 +176,14 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
|
|||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
@Override
|
||||
public char[] getNameCharArray() {
|
||||
try {
|
||||
return super.getNameCharArray();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return new char[0];
|
||||
return CharArrayUtils.EMPTY;
|
||||
}
|
||||
|
||||
public IIndexScope getParent() {
|
||||
|
@ -219,12 +222,14 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
|
|||
return pdom;
|
||||
}
|
||||
|
||||
@Override
|
||||
abstract protected int getRecordSize(); // superclass's implementation is no longer valid
|
||||
|
||||
/* For debug purposes only
|
||||
* (non-Javadoc)
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
try {
|
||||
return getName() + " " + getConstantNameForValue(getLinkageImpl(), getNodeType()); //$NON-NLS-1$
|
||||
|
@ -381,6 +386,7 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen
|
|||
public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException {
|
||||
}
|
||||
|
||||
@Override
|
||||
final public void delete(PDOMLinkage linkage) throws CoreException {
|
||||
assert false;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ import org.eclipse.cdt.core.dom.ILinkage;
|
|||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDirective;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
|
@ -30,12 +32,13 @@ import org.eclipse.cdt.core.index.IIndexInclude;
|
|||
import org.eclipse.cdt.core.index.IIndexLocationConverter;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
|
||||
import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IWritableIndex.IncludeInformation;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||
|
@ -53,6 +56,7 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
private final PDOM pdom;
|
||||
private final int record;
|
||||
private IIndexFileLocation location;
|
||||
private PDOMLinkage fLinkage;
|
||||
|
||||
private static final int FIRST_NAME = 0;
|
||||
private static final int FIRST_INCLUDE = 4;
|
||||
|
@ -63,8 +67,9 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
private static final int TIME_STAMP = 24;
|
||||
private static final int SCANNER_CONFIG_HASH= 32;
|
||||
private static final int FIRST_USING_DIRECTIVE= 36;
|
||||
private static final int FIRST_MACRO_REFERENCE= 40;
|
||||
|
||||
private static final int RECORD_SIZE= 40;
|
||||
private static final int RECORD_SIZE= 44;
|
||||
|
||||
public static class Comparator implements IBTreeComparator {
|
||||
private Database db;
|
||||
|
@ -167,16 +172,26 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
db.putInt(record + SCANNER_CONFIG_HASH, hashcode);
|
||||
}
|
||||
|
||||
public PDOMName getFirstName() throws CoreException {
|
||||
private PDOMName getFirstName() throws CoreException {
|
||||
int namerec = pdom.getDB().getInt(record + FIRST_NAME);
|
||||
return namerec != 0 ? new PDOMName(pdom, namerec) : null;
|
||||
}
|
||||
|
||||
public void setFirstName(PDOMName firstName) throws CoreException {
|
||||
private void setFirstName(PDOMName firstName) throws CoreException {
|
||||
int namerec = firstName != null ? firstName.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + FIRST_NAME, namerec);
|
||||
}
|
||||
|
||||
private PDOMMacroReferenceName getFirstMacroReference() throws CoreException {
|
||||
int namerec = pdom.getDB().getInt(record + FIRST_MACRO_REFERENCE);
|
||||
return namerec != 0 ? new PDOMMacroReferenceName(pdom, namerec) : null;
|
||||
}
|
||||
|
||||
private void setFirstMacroReference(PDOMMacroReferenceName firstName) throws CoreException {
|
||||
int namerec = firstName != null ? firstName.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + FIRST_MACRO_REFERENCE, namerec);
|
||||
}
|
||||
|
||||
public PDOMInclude getFirstInclude() throws CoreException {
|
||||
int increc = pdom.getDB().getInt(record + FIRST_INCLUDE);
|
||||
return increc != 0 ? new PDOMInclude(pdom, increc) : null;
|
||||
|
@ -215,9 +230,11 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
assert getFirstMacro() == null;
|
||||
|
||||
PDOMMacro lastMacro= null;
|
||||
final PDOMLinkage linkage = getLinkage();
|
||||
for (int i = 0; i < macros.length; i++) {
|
||||
IASTPreprocessorMacroDefinition macro = macros[i];
|
||||
PDOMMacro pdomMacro = new PDOMMacro(pdom, macro, this);
|
||||
PDOMMacroContainer container= linkage.getMacroContainer(macro.getName().toCharArray());
|
||||
PDOMMacro pdomMacro = new PDOMMacro(pdom, container, macro, this);
|
||||
if (lastMacro == null) {
|
||||
setFirstMacro(pdomMacro);
|
||||
}
|
||||
|
@ -225,20 +242,34 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
lastMacro.setNextMacro(pdomMacro);
|
||||
}
|
||||
lastMacro= pdomMacro;
|
||||
pdom.afterAddMacro(pdomMacro);
|
||||
}
|
||||
}
|
||||
|
||||
PDOMLinkage getLinkage() throws CoreException {
|
||||
if (fLinkage == null) {
|
||||
final String linkageName = Linkage.getLinkageName(getLinkageID());
|
||||
fLinkage= pdom.createLinkage(linkageName);
|
||||
if (fLinkage == null) {
|
||||
throw new CoreException(CCorePlugin.createStatus("Unsupported linkage: " + linkageName)); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
return fLinkage;
|
||||
}
|
||||
|
||||
public void addNames(IASTName[][] names) throws CoreException {
|
||||
assert getFirstName() == null;
|
||||
assert getFirstMacroReference() == null;
|
||||
final PDOMLinkage linkage= getLinkage();
|
||||
HashMap<IASTName, PDOMName> nameCache= new HashMap<IASTName, PDOMName>();
|
||||
PDOMName lastName= null;
|
||||
PDOMMacroReferenceName lastMacroName= null;
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
IASTName[] name = names[i];
|
||||
if (name[0] != null) {
|
||||
PDOMName caller= nameCache.get(name[1]);
|
||||
PDOMName pdomName = createPDOMName(name[0], caller);
|
||||
if (pdomName != null) {
|
||||
IIndexFragmentName fname= createPDOMName(linkage, name[0], caller);
|
||||
if (fname instanceof PDOMName) {
|
||||
PDOMName pdomName = (PDOMName) fname;
|
||||
nameCache.put(name[0], pdomName);
|
||||
if (lastName == null) {
|
||||
setFirstName(pdomName);
|
||||
|
@ -248,25 +279,46 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
}
|
||||
lastName= pdomName;
|
||||
}
|
||||
else if (fname instanceof PDOMMacroReferenceName) {
|
||||
PDOMMacroReferenceName macroName = (PDOMMacroReferenceName) fname;
|
||||
if (lastMacroName == null) {
|
||||
setFirstMacroReference(macroName);
|
||||
}
|
||||
else {
|
||||
lastMacroName.setNextInFile(macroName);
|
||||
}
|
||||
lastMacroName= macroName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private PDOMName createPDOMName(IASTName name, PDOMName caller) {
|
||||
if (name.getBinding() instanceof IParameter) {
|
||||
private IIndexFragmentName createPDOMName(PDOMLinkage linkage, IASTName name, PDOMName caller) {
|
||||
final IBinding binding = name.getBinding();
|
||||
if (binding instanceof IParameter) {
|
||||
return null;
|
||||
}
|
||||
PDOMName result= null;
|
||||
try {
|
||||
PDOMBinding binding = ((WritablePDOM) pdom).addBinding(name);
|
||||
if (binding != null) {
|
||||
result= new PDOMName(pdom, name, this, binding, caller);
|
||||
binding.getLinkageImpl().onCreateName(this, name, result);
|
||||
if (binding instanceof IMacroBinding) {
|
||||
return createPDOMMacroReferenceName(linkage, name);
|
||||
}
|
||||
else {
|
||||
PDOMBinding pdomBinding = linkage.addBinding(name);
|
||||
if (pdomBinding != null) {
|
||||
final PDOMName result= new PDOMName(pdom, name, this, pdomBinding, caller);
|
||||
linkage.onCreateName(this, name, result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return result;
|
||||
return null;
|
||||
}
|
||||
|
||||
private IIndexFragmentName createPDOMMacroReferenceName(PDOMLinkage linkage, IASTName name) throws CoreException {
|
||||
PDOMMacroContainer cont= linkage.getMacroContainer(name.toCharArray());
|
||||
return new PDOMMacroReferenceName(pdom, name, this, cont);
|
||||
}
|
||||
|
||||
public void clear(Collection<IIndexFileLocation> contextsRemoved) throws CoreException {
|
||||
|
@ -293,7 +345,6 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
// Delete all the macros in this file
|
||||
PDOMMacro macro = getFirstMacro();
|
||||
while (macro != null) {
|
||||
pdom.beforeRemoveMacro(macro);
|
||||
PDOMMacro nextMacro = macro.getNextMacro();
|
||||
macro.delete();
|
||||
macro = nextMacro;
|
||||
|
@ -301,19 +352,32 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
setFirstMacro(null);
|
||||
|
||||
// Delete all the names in this file
|
||||
PDOMLinkage linkage= getLinkage();
|
||||
ArrayList<PDOMName> names= new ArrayList<PDOMName>();
|
||||
PDOMName name = getFirstName();
|
||||
while (name != null) {
|
||||
names.add(name);
|
||||
name.getBinding().getLinkageImpl().onDeleteName(name);
|
||||
linkage.onDeleteName(name);
|
||||
name= name.getNextInFile();
|
||||
}
|
||||
|
||||
for (Iterator<PDOMName> iterator = names.iterator(); iterator.hasNext();) {
|
||||
name = iterator.next();
|
||||
name.delete();
|
||||
}
|
||||
setFirstName(null);
|
||||
|
||||
// Delete all macro references
|
||||
ArrayList<PDOMMacroReferenceName> mrefs= new ArrayList<PDOMMacroReferenceName>();
|
||||
PDOMMacroReferenceName mref = getFirstMacroReference();
|
||||
while (mref != null) {
|
||||
mrefs.add(mref);
|
||||
mref= mref.getNextInFile();
|
||||
}
|
||||
for (PDOMMacroReferenceName m : mrefs) {
|
||||
m.delete();
|
||||
}
|
||||
setFirstMacroReference(null);
|
||||
|
||||
setTimestamp(-1);
|
||||
}
|
||||
|
||||
|
@ -388,7 +452,7 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
}
|
||||
|
||||
public IIndexName[] findNames(int offset, int length) throws CoreException {
|
||||
ArrayList<PDOMName> result= new ArrayList<PDOMName>();
|
||||
ArrayList<IIndexName> result= new ArrayList<IIndexName>();
|
||||
for (PDOMName name= getFirstName(); name != null; name= name.getNextInFile()) {
|
||||
int nameOffset= name.getNodeOffset();
|
||||
if (nameOffset >= offset) {
|
||||
|
@ -403,6 +467,28 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
}
|
||||
|
||||
}
|
||||
for (PDOMMacro name= getFirstMacro(); name != null; name= name.getNextMacro()) {
|
||||
int nameOffset= name.getNodeOffset();
|
||||
if (nameOffset >= offset) {
|
||||
if (nameOffset + name.getNodeLength() <= offset+length) {
|
||||
result.add(name.getDefinition());
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (PDOMMacroReferenceName name= getFirstMacroReference(); name != null; name= name.getNextInFile()) {
|
||||
int nameOffset= name.getNodeOffset();
|
||||
if (nameOffset >= offset) {
|
||||
if (nameOffset + name.getNodeLength() <= offset+length) {
|
||||
result.add(name);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toArray(new IIndexName[result.size()]);
|
||||
}
|
||||
|
||||
|
|
|
@ -57,13 +57,16 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
private static final int NEXT_OFFSET = PDOMNamedNode.RECORD_SIZE + 4;
|
||||
private static final int INDEX_OFFSET = PDOMNamedNode.RECORD_SIZE + 8;
|
||||
private static final int NESTED_BINDINGS_INDEX = PDOMNamedNode.RECORD_SIZE + 12;
|
||||
private static final int MACRO_BTREE = PDOMNamedNode.RECORD_SIZE + 16;
|
||||
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 16;
|
||||
protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 20;
|
||||
|
||||
// node types
|
||||
protected static final int LINKAGE= 0; // special one for myself
|
||||
|
||||
private BTree fMacroIndex= null;
|
||||
|
||||
public PDOMLinkage(PDOM pdom, int record) {
|
||||
super(pdom, record);
|
||||
}
|
||||
|
@ -78,10 +81,12 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
pdom.insertLinkage(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRecordSize() {
|
||||
return RECORD_SIZE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNodeType() {
|
||||
return LINKAGE;
|
||||
}
|
||||
|
@ -113,6 +118,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
return new BTree(getPDOM().getDB(), record + NESTED_BINDINGS_INDEX, getNestedBindingsComparator());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(final IPDOMVisitor visitor) throws CoreException {
|
||||
if (visitor instanceof IBTreeVisitor) {
|
||||
getIndex().accept((IBTreeVisitor) visitor);
|
||||
|
@ -134,10 +140,12 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ILinkage getLinkage() throws CoreException {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void addChild(PDOMNode child) throws CoreException {
|
||||
getIndex().insert(child.getRecord());
|
||||
}
|
||||
|
@ -212,14 +220,6 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
}
|
||||
|
||||
protected abstract PDOMBinding doAdaptBinding(IBinding binding) throws CoreException;
|
||||
|
||||
public final PDOMBinding resolveBinding(IASTName name) throws CoreException {
|
||||
IBinding binding= name.resolveBinding();
|
||||
if (binding != null) {
|
||||
return adaptBinding(binding);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
final protected int getLocalToFileRec(PDOMNode parent, IBinding binding) throws CoreException {
|
||||
int rec= 0;
|
||||
|
@ -341,6 +341,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
// no implementation, yet.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(PDOMLinkage linkage) throws CoreException {
|
||||
assert false; // no need to delete linkages.
|
||||
}
|
||||
|
@ -348,4 +349,48 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage
|
|||
public ICPPUsingDirective[] getUsingDirectives(PDOMFile file) throws CoreException {
|
||||
return ICPPUsingDirective.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
public BTree getMacroIndex() {
|
||||
if (fMacroIndex == null) {
|
||||
fMacroIndex= new BTree(pdom.getDB(), record + MACRO_BTREE, new FindBinding.MacroBTreeComparator(pdom));
|
||||
}
|
||||
return fMacroIndex;
|
||||
}
|
||||
|
||||
public PDOMMacroContainer findMacroContainer(final char[] name) throws CoreException {
|
||||
return findMacroContainer(name, pdom.createKeyForCache(record, name));
|
||||
}
|
||||
|
||||
private PDOMMacroContainer findMacroContainer(final char[] name, final String key) throws CoreException {
|
||||
Object result= pdom.getCachedResult(key);
|
||||
if (result instanceof PDOMMacroContainer) {
|
||||
return ((PDOMMacroContainer) result);
|
||||
}
|
||||
assert result==null;
|
||||
|
||||
MacroContainerFinder visitor = new MacroContainerFinder(pdom, name);
|
||||
getMacroIndex().accept(visitor);
|
||||
PDOMMacroContainer container= visitor.getMacroContainer();
|
||||
if (container != null) {
|
||||
pdom.putCachedResult(key, container);
|
||||
}
|
||||
return container;
|
||||
}
|
||||
|
||||
public PDOMMacroContainer getMacroContainer(char[] name) throws CoreException {
|
||||
String key= pdom.createKeyForCache(record, name);
|
||||
PDOMMacroContainer result= findMacroContainer(name, key);
|
||||
if (result == null) {
|
||||
result= new PDOMMacroContainer(pdom, this, name);
|
||||
getMacroIndex().insert(result.getRecord());
|
||||
pdom.putCachedResult(key, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void removeMacroContainer (PDOMMacroContainer container) throws CoreException {
|
||||
String key= pdom.createKeyForCache(record, container.getNameCharArray());
|
||||
pdom.putCachedResult(key, null);
|
||||
getMacroIndex().delete(container.getRecord());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,17 +19,19 @@ import java.util.List;
|
|||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ILinkage;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.parser.Keywords;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||
import org.eclipse.cdt.internal.core.parser.scanner.MacroDefinitionParser;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
|
@ -37,99 +39,121 @@ import org.eclipse.cdt.internal.core.pdom.db.IString;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* Represents macros.
|
||||
*
|
||||
* @author Doug Schaefer
|
||||
* Represents macro definitions. They are stored with the file and with a PDOMMacroContainer. The latter also
|
||||
* contains the references to all macros with the same name.
|
||||
*/
|
||||
public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
||||
|
||||
private static final byte MACROSTYLE_OBJECT = 1;
|
||||
private static final byte MACROSTYLE_FUNCTION= 2;
|
||||
public class PDOMMacro implements IIndexMacro, IIndexFragmentBinding, IASTFileLocation {
|
||||
|
||||
private static final int NAME = 0;
|
||||
private static final int CONTAINER = 0;
|
||||
private static final int FILE = 4;
|
||||
private static final int NAME_OFFSET = 8;
|
||||
private static final int NAME_LENGTH = 12; // short
|
||||
private static final int FIRST_PARAMETER = 14;
|
||||
private static final int EXPANSION = 18;
|
||||
private static final int NEXT_MACRO = 22;
|
||||
private static final int MACRO_STYLE = 26; // byte
|
||||
private static final int PARAMETERS= 8;
|
||||
private static final int EXPANSION = 12;
|
||||
private static final int NEXT_IN_FILE = 16;
|
||||
private static final int NEXT_IN_CONTAINER = 20;
|
||||
private static final int PREV_IN_CONTAINER = 24;
|
||||
private static final int NAME_OFFSET = 28;
|
||||
private static final int NAME_LENGTH = 32; // short
|
||||
|
||||
private static final int RECORD_SIZE = 27;
|
||||
private static final int RECORD_SIZE = 34;
|
||||
private static final char[][] UNINITIALIZED= {};
|
||||
|
||||
private final PDOM pdom;
|
||||
private final int record;
|
||||
|
||||
private final PDOM fPDOM;
|
||||
private final int fRecord;
|
||||
|
||||
private char[][] fParameterList= UNINITIALIZED;
|
||||
private char[] fName;
|
||||
private char[] fExpansion;
|
||||
private PDOMMacroContainer fContainer;
|
||||
private PDOMMacroDefinitionName fDefinition;
|
||||
|
||||
public PDOMMacro(PDOM pdom, int record) {
|
||||
this.pdom = pdom;
|
||||
this.record = record;
|
||||
fPDOM = pdom;
|
||||
fRecord = record;
|
||||
}
|
||||
|
||||
public PDOMMacro(PDOM pdom, IASTPreprocessorMacroDefinition macro, PDOMFile file) throws CoreException {
|
||||
this.pdom = pdom;
|
||||
public PDOMMacro(PDOM pdom, PDOMMacroContainer container, IASTPreprocessorMacroDefinition macro, PDOMFile file) throws CoreException {
|
||||
final Database db= pdom.getDB();
|
||||
|
||||
Database db = pdom.getDB();
|
||||
this.record = db.malloc(RECORD_SIZE);
|
||||
IASTName name = macro.getName();
|
||||
IMacroBinding binding= (IMacroBinding) name.getBinding();
|
||||
fPDOM = pdom;
|
||||
fRecord = db.malloc(RECORD_SIZE);
|
||||
fContainer= container;
|
||||
|
||||
db.putInt(record + NAME, db.newString(name.toCharArray()).getRecord());
|
||||
db.putInt(record + FILE, file.getRecord());
|
||||
IASTFileLocation fileloc = name.getFileLocation();
|
||||
db.putInt(record + NAME_OFFSET, fileloc.getNodeOffset());
|
||||
db.putShort(record + NAME_LENGTH, (short) fileloc.getNodeLength());
|
||||
db.putInt(record + EXPANSION, db.newString(binding.getExpansionImage()).getRecord());
|
||||
setNextMacro(0);
|
||||
final IASTName name = macro.getName();
|
||||
final IASTFileLocation fileloc = name.getFileLocation();
|
||||
final IMacroBinding binding= (IMacroBinding) name.getBinding();
|
||||
final char[][] params= binding.getParameterList();
|
||||
|
||||
db.putInt(fRecord + CONTAINER, container.getRecord());
|
||||
db.putInt(fRecord + FILE, file.getRecord());
|
||||
db.putInt(fRecord + EXPANSION, db.newString(binding.getExpansionImage()).getRecord());
|
||||
db.putInt(fRecord + NAME_OFFSET, fileloc.getNodeOffset());
|
||||
db.putShort(fRecord + NAME_LENGTH, (short) fileloc.getNodeLength());
|
||||
|
||||
byte macroStyle= MACROSTYLE_OBJECT;
|
||||
PDOMMacroParameter last = null;
|
||||
char[][] params= binding.getParameterList();
|
||||
if (params != null) {
|
||||
macroStyle= MACROSTYLE_FUNCTION;
|
||||
for (int i = params.length - 1; i >= 0; --i) {
|
||||
PDOMMacroParameter pdomParam = new PDOMMacroParameter(pdom, params[i]);
|
||||
if (last != null)
|
||||
pdomParam.setNextParameter(last);
|
||||
last = pdomParam;
|
||||
StringBuilder buf= new StringBuilder();
|
||||
for (int i= 0; i < params.length; i++) {
|
||||
buf.append(params[i]);
|
||||
buf.append(',');
|
||||
}
|
||||
db.putInt(fRecord + PARAMETERS, db.newString(buf.toString().toCharArray()).getRecord());
|
||||
}
|
||||
db.putInt(record + FIRST_PARAMETER, last != null ? last.getRecord() : 0);
|
||||
db.putByte(record + MACRO_STYLE, macroStyle);
|
||||
|
||||
fContainer.addDefinition(this);
|
||||
}
|
||||
|
||||
public PDOM getPDOM() {
|
||||
return fPDOM;
|
||||
}
|
||||
|
||||
public int getRecord() {
|
||||
return record;
|
||||
return fRecord;
|
||||
}
|
||||
|
||||
public void delete() throws CoreException {
|
||||
getNameInDB(pdom, record).delete();
|
||||
// Delete from the binding chain
|
||||
PDOMMacro prevName = getPrevInContainer();
|
||||
PDOMMacro nextName = getNextInContainer();
|
||||
if (prevName != null)
|
||||
prevName.setNextInContainer(nextName);
|
||||
else {
|
||||
PDOMMacroContainer container= getContainer();
|
||||
container.setFirstDefinition(nextName);
|
||||
if (nextName == null && container.isOrphaned()) {
|
||||
container.delete(container.getLinkageImpl());
|
||||
}
|
||||
}
|
||||
if (nextName != null)
|
||||
nextName.setPrevInContainer(prevName);
|
||||
|
||||
|
||||
getExpansionInDB().delete();
|
||||
PDOMMacroParameter param = getFirstParameter();
|
||||
if (param != null)
|
||||
param.delete();
|
||||
pdom.getDB().free(record);
|
||||
final IString params = getParamListInDB();
|
||||
if (params != null) {
|
||||
params.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static IString getNameInDB(PDOM pdom, int record) throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
int rec = db.getInt(record + NAME);
|
||||
return db.getString(rec);
|
||||
public PDOMMacroContainer getContainer() throws CoreException {
|
||||
if (fContainer == null) {
|
||||
fContainer= new PDOMMacroContainer(fPDOM, fPDOM.getDB().getInt(fRecord + CONTAINER));
|
||||
}
|
||||
return fContainer;
|
||||
}
|
||||
|
||||
|
||||
private IString getExpansionInDB() throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
int rec = db.getInt(record + EXPANSION);
|
||||
Database db = fPDOM.getDB();
|
||||
int rec = db.getInt(fRecord + EXPANSION);
|
||||
return db.getString(rec);
|
||||
}
|
||||
|
||||
|
||||
private IString getParamListInDB() throws CoreException {
|
||||
Database db = fPDOM.getDB();
|
||||
int rec = db.getInt(fRecord + PARAMETERS);
|
||||
return rec == 0 ? null : db.getString(rec);
|
||||
}
|
||||
|
||||
public PDOMMacro getNextMacro() throws CoreException {
|
||||
int rec = pdom.getDB().getInt(record + NEXT_MACRO);
|
||||
return rec != 0 ? new PDOMMacro(pdom, rec) : null;
|
||||
int rec = fPDOM.getDB().getInt(fRecord + NEXT_IN_FILE);
|
||||
return rec != 0 ? new PDOMMacro(fPDOM, rec) : null;
|
||||
}
|
||||
|
||||
public void setNextMacro(PDOMMacro macro) throws CoreException {
|
||||
|
@ -137,25 +161,50 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
}
|
||||
|
||||
private void setNextMacro(int rec) throws CoreException {
|
||||
pdom.getDB().putInt(record + NEXT_MACRO, rec);
|
||||
fPDOM.getDB().putInt(fRecord + NEXT_IN_FILE, rec);
|
||||
}
|
||||
|
||||
private PDOMMacro getPrevInContainer() throws CoreException {
|
||||
return getMacroField(PREV_IN_CONTAINER);
|
||||
}
|
||||
|
||||
void setPrevInContainer(PDOMMacro macro) throws CoreException {
|
||||
setMacroField(PREV_IN_CONTAINER, macro);
|
||||
}
|
||||
|
||||
public PDOMMacro getNextInContainer() throws CoreException {
|
||||
return getMacroField(NEXT_IN_CONTAINER);
|
||||
}
|
||||
|
||||
private PDOMMacroParameter getFirstParameter() throws CoreException {
|
||||
int rec = pdom.getDB().getInt(record + FIRST_PARAMETER);
|
||||
return rec != 0 ? new PDOMMacroParameter(pdom, rec) : null;
|
||||
void setNextInContainer(PDOMMacro macro) throws CoreException {
|
||||
setMacroField(NEXT_IN_CONTAINER, macro);
|
||||
}
|
||||
|
||||
|
||||
private void setMacroField(int offset, PDOMMacro macro) throws CoreException {
|
||||
int namerec = macro != null ? macro.getRecord() : 0;
|
||||
fPDOM.getDB().putInt(fRecord + offset, namerec);
|
||||
}
|
||||
|
||||
private PDOMMacro getMacroField(int offset) throws CoreException {
|
||||
int namerec= fPDOM.getDB().getInt(fRecord + offset);
|
||||
return namerec != 0 ? new PDOMMacro(fPDOM, namerec) : null;
|
||||
}
|
||||
|
||||
public char[][] getParameterList() {
|
||||
if (fParameterList == UNINITIALIZED) {
|
||||
fParameterList= null;
|
||||
try {
|
||||
byte style= pdom.getDB().getByte(record + MACRO_STYLE);
|
||||
if (style == MACROSTYLE_FUNCTION) {
|
||||
IString plist= getParamListInDB();
|
||||
if (plist != null) {
|
||||
List<char[]> paramList = new ArrayList<char[]>();
|
||||
PDOMMacroParameter param= getFirstParameter();
|
||||
while (param != null) {
|
||||
paramList.add(param.getName().getChars());
|
||||
param = param.getNextParameter();
|
||||
final char[] cplist= plist.getChars();
|
||||
final int end = cplist.length;
|
||||
int from= 0;
|
||||
int to= CharArrayUtils.indexOf(',', cplist, from, end);
|
||||
while (to > from) {
|
||||
paramList.add(CharArrayUtils.extract(cplist, from, to-from));
|
||||
from= to+1;
|
||||
to= CharArrayUtils.indexOf(',', cplist, from, end);
|
||||
}
|
||||
fParameterList= paramList.toArray(new char[paramList.size()][]);
|
||||
}
|
||||
|
@ -179,24 +228,22 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
}
|
||||
|
||||
public char[] getNameCharArray() {
|
||||
if (fName == null) {
|
||||
try {
|
||||
fName= getNameInDB(pdom, record).getChars();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
fName= new char[] { ' ' };
|
||||
}
|
||||
try {
|
||||
return getContainer().getNameCharArray();
|
||||
}
|
||||
catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return new char[]{' '};
|
||||
}
|
||||
return fName;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return new String(getNameCharArray());
|
||||
}
|
||||
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
int filerec = pdom.getDB().getInt(record + FILE);
|
||||
return filerec != 0 ? new PDOMFile(pdom, filerec) : null;
|
||||
public PDOMFile getFile() throws CoreException {
|
||||
int filerec = fPDOM.getDB().getInt(fRecord + FILE);
|
||||
return filerec != 0 ? new PDOMFile(fPDOM, filerec) : null;
|
||||
}
|
||||
|
||||
public int getEndingLineNumber() {
|
||||
|
@ -205,7 +252,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
|
||||
public String getFileName() {
|
||||
try {
|
||||
PDOMFile file = (PDOMFile) getFile();
|
||||
PDOMFile file = getFile();
|
||||
if(file!=null) {
|
||||
/*
|
||||
* We need to spec. what this method can return to know
|
||||
|
@ -236,7 +283,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
|
||||
public int getNodeLength() {
|
||||
try {
|
||||
return pdom.getDB().getShort(record + NAME_LENGTH);
|
||||
return fPDOM.getDB().getShort(fRecord + NAME_LENGTH);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return 0;
|
||||
|
@ -245,7 +292,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
|
||||
public int getNodeOffset() {
|
||||
try {
|
||||
return pdom.getDB().getInt(record + NAME_OFFSET);
|
||||
return fPDOM.getDB().getInt(fRecord + NAME_OFFSET);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return 0;
|
||||
|
@ -281,15 +328,53 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
}
|
||||
|
||||
public ILinkage getLinkage() throws CoreException {
|
||||
return Linkage.NO_LINKAGE;
|
||||
return getFile().getLinkage();
|
||||
}
|
||||
|
||||
public IScope getScope() throws DOMException {
|
||||
public IIndexScope getScope() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object getAdapter(Class adapter) {
|
||||
if (adapter.isAssignableFrom(PDOMMacro.class)) {
|
||||
return this;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IIndexFragmentName getDefinition() {
|
||||
if (fDefinition == null) {
|
||||
fDefinition= new PDOMMacroDefinitionName(this);
|
||||
}
|
||||
return fDefinition;
|
||||
}
|
||||
|
||||
public IIndexFile getLocalToFile() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String[] getQualifiedName() {
|
||||
return new String[]{getName()};
|
||||
}
|
||||
|
||||
public boolean isFileLocal() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public int getBindingConstant() {
|
||||
return IIndexBindingConstants.MACRO_DEFINITION;
|
||||
}
|
||||
|
||||
public IIndexFragment getFragment() {
|
||||
return fPDOM;
|
||||
}
|
||||
|
||||
public boolean hasDeclaration() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasDefinition() throws CoreException {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,175 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, 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:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexMacroContainer;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* A container collecting definitions and references for macros.
|
||||
* @since 5.0
|
||||
*/
|
||||
public class PDOMMacroContainer extends PDOMNamedNode implements IIndexMacroContainer, IIndexFragmentBinding {
|
||||
private static final int FIRST_DEF_OFFSET = PDOMNamedNode.RECORD_SIZE + 0; // size 4
|
||||
private static final int FIRST_REF_OFFSET = PDOMNamedNode.RECORD_SIZE + 4; // size 4
|
||||
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 8;
|
||||
|
||||
public PDOMMacroContainer(PDOM pdom, PDOMLinkage linkage, char[] name) throws CoreException {
|
||||
super(pdom, linkage, name);
|
||||
}
|
||||
|
||||
PDOMMacroContainer(PDOM pdom, int record) {
|
||||
super(pdom, record);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNodeType() {
|
||||
return IIndexBindingConstants.MACRO_CONTAINER;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getRecordSize() {
|
||||
return RECORD_SIZE;
|
||||
}
|
||||
|
||||
public boolean isOrphaned() throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
return db.getInt(record + FIRST_DEF_OFFSET) == 0
|
||||
&& db.getInt(record + FIRST_REF_OFFSET) == 0;
|
||||
}
|
||||
|
||||
public void addDefinition(PDOMMacro name) throws CoreException {
|
||||
PDOMMacro first = getFirstDefinition();
|
||||
if (first != null) {
|
||||
first.setPrevInContainer(name);
|
||||
name.setNextInContainer(first);
|
||||
}
|
||||
setFirstDefinition(name);
|
||||
}
|
||||
|
||||
public void addReference(PDOMMacroReferenceName name) throws CoreException {
|
||||
PDOMMacroReferenceName first = getFirstReference();
|
||||
if (first != null) {
|
||||
first.setPrevInContainer(name);
|
||||
name.setNextInContainer(first);
|
||||
}
|
||||
setFirstReference(name);
|
||||
}
|
||||
|
||||
public PDOMMacro getFirstDefinition() throws CoreException {
|
||||
int namerec = pdom.getDB().getInt(record + FIRST_DEF_OFFSET);
|
||||
return namerec != 0 ? new PDOMMacro(pdom, namerec) : null;
|
||||
}
|
||||
|
||||
void setFirstDefinition(PDOMMacro macro) throws CoreException {
|
||||
int namerec = macro != null ? macro.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + FIRST_DEF_OFFSET, namerec);
|
||||
}
|
||||
|
||||
public PDOMMacroReferenceName getFirstReference() throws CoreException {
|
||||
int namerec = pdom.getDB().getInt(record + FIRST_REF_OFFSET);
|
||||
return namerec != 0 ? new PDOMMacroReferenceName(pdom, namerec) : null;
|
||||
}
|
||||
|
||||
void setFirstReference(PDOMMacroReferenceName nextName) throws CoreException {
|
||||
int namerec = nextName != null ? nextName.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + FIRST_REF_OFFSET, namerec);
|
||||
}
|
||||
|
||||
public IIndexMacro[] getDefinitions() throws CoreException {
|
||||
PDOMMacro macro;
|
||||
List<PDOMMacro> macros= new ArrayList<PDOMMacro>();
|
||||
for (macro= getFirstDefinition(); macro != null; macro= macro.getNextInContainer()) {
|
||||
macros.add(macro);
|
||||
}
|
||||
return macros.toArray(new IIndexMacro[macros.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(PDOMLinkage linkage) throws CoreException {
|
||||
if (linkage != null) {
|
||||
linkage.removeMacroContainer(this);
|
||||
}
|
||||
super.delete(linkage);
|
||||
}
|
||||
|
||||
public int getBindingConstant() {
|
||||
return IIndexBindingConstants.MACRO_CONTAINER;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.internal.core.index.IIndexFragmentBinding#getFragment()
|
||||
*/
|
||||
public IIndexFragment getFragment() {
|
||||
return pdom;
|
||||
}
|
||||
|
||||
public IIndexScope getScope() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean hasDeclaration() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasDefinition() throws CoreException {
|
||||
return pdom.getDB().getInt(record + FIRST_DEF_OFFSET) != 0;
|
||||
}
|
||||
|
||||
public IIndexFile getLocalToFile() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String[] getQualifiedName() {
|
||||
return new String[]{getName()};
|
||||
}
|
||||
|
||||
public boolean isFileLocal() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public char[] getNameCharArray() {
|
||||
try {
|
||||
return super.getNameCharArray();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return CharArrayUtils.EMPTY;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return new String(getNameCharArray());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object getAdapter(Class adapter) {
|
||||
if (adapter.isAssignableFrom(PDOMMacroContainer.class)) {
|
||||
return this;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2008 Wind River Systems, 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:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
class PDOMMacroDefinitionName implements IIndexFragmentName {
|
||||
private final PDOMMacro fMacro;
|
||||
|
||||
PDOMMacroDefinitionName(PDOMMacro macro) {
|
||||
fMacro = macro;
|
||||
}
|
||||
|
||||
public PDOMMacro getMacro() {
|
||||
return fMacro;
|
||||
}
|
||||
|
||||
public boolean couldBePolymorphicMethodCall() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
public IIndexName[] getEnclosedNames() throws CoreException {
|
||||
return IIndexName.EMPTY_ARRAY;
|
||||
}
|
||||
public IIndexName getEnclosingDefinition() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
return fMacro.getFile();
|
||||
}
|
||||
public int getNodeLength() {
|
||||
return fMacro.getNodeLength();
|
||||
}
|
||||
public int getNodeOffset() {
|
||||
return fMacro.getNodeOffset();
|
||||
}
|
||||
public boolean isBaseSpecifier() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
public boolean isReadAccess() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
public boolean isWriteAccess() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
public IASTFileLocation getFileLocation() {
|
||||
return fMacro;
|
||||
}
|
||||
public boolean isDeclaration() {
|
||||
return false;
|
||||
}
|
||||
public boolean isDefinition() {
|
||||
return true;
|
||||
}
|
||||
public boolean isReference() {
|
||||
return false;
|
||||
}
|
||||
public char[] toCharArray() {
|
||||
return fMacro.getNameCharArray();
|
||||
}
|
||||
public IIndexFragmentBinding getBinding() {
|
||||
return fMacro;
|
||||
}
|
||||
public IIndexFragment getIndexFragment() {
|
||||
return fMacro.getFragment();
|
||||
}
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2008 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
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.IString;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
*/
|
||||
public class PDOMMacroParameter {
|
||||
|
||||
private final PDOM pdom;
|
||||
private final int record;
|
||||
|
||||
private static final int NEXT = 0;
|
||||
private static final int NAME = 4;
|
||||
|
||||
private static final int RECORD_SIZE = 8;
|
||||
|
||||
public PDOMMacroParameter(PDOM pdom, int record) {
|
||||
this.pdom = pdom;
|
||||
this.record = record;
|
||||
}
|
||||
|
||||
public PDOMMacroParameter(PDOM pdom, char[] name) throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
|
||||
this.pdom = pdom;
|
||||
this.record = db.malloc(RECORD_SIZE);
|
||||
|
||||
db.putInt(record + NEXT, 0);
|
||||
db.putInt(record + NAME, db.newString(name).getRecord());
|
||||
}
|
||||
|
||||
public int getRecord() {
|
||||
return record;
|
||||
}
|
||||
|
||||
public void delete() throws CoreException {
|
||||
PDOMMacroParameter next = getNextParameter();
|
||||
if (next != null)
|
||||
next.delete();
|
||||
getName().delete();
|
||||
pdom.getDB().free(record);
|
||||
}
|
||||
|
||||
public void setNextParameter(PDOMMacroParameter next) throws CoreException {
|
||||
int rec = next != null ? next.getRecord() : 0;
|
||||
pdom.getDB().putInt(record + NEXT, rec);
|
||||
}
|
||||
|
||||
public PDOMMacroParameter getNextParameter() throws CoreException {
|
||||
int rec = pdom.getDB().getInt(record + NEXT);
|
||||
return rec != 0 ? new PDOMMacroParameter(pdom, rec) : null;
|
||||
}
|
||||
|
||||
public IString getName() throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
return db.getString(db.getInt(record + NAME));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,255 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2005, 2008 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
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.core.filesystem.EFS;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* Represents declarations, definitions and references to bindings, except for macros.
|
||||
*/
|
||||
public final class PDOMMacroReferenceName implements IIndexFragmentName, IASTFileLocation {
|
||||
|
||||
private final PDOM pdom;
|
||||
private final int record;
|
||||
|
||||
private static final int FILE_REC_OFFSET = 0;
|
||||
private static final int FILE_NEXT_OFFSET = 4;
|
||||
private static final int CONTAINER_REC_OFFSET = 8;
|
||||
private static final int CONTAINER_PREV_OFFSET = 12;
|
||||
private static final int CONTAINER_NEXT_OFFSET = 16;
|
||||
private static final int NODE_OFFSET_OFFSET = 20;
|
||||
private static final int NODE_LENGTH_OFFSET = 24;
|
||||
|
||||
private static final int RECORD_SIZE = 26;
|
||||
|
||||
public PDOMMacroReferenceName(PDOM pdom, IASTName name, PDOMFile file, PDOMMacroContainer container) throws CoreException {
|
||||
this.pdom = pdom;
|
||||
Database db = pdom.getDB();
|
||||
record = db.malloc(RECORD_SIZE);
|
||||
|
||||
db.putInt(record + CONTAINER_REC_OFFSET, container.getRecord());
|
||||
db.putInt(record + FILE_REC_OFFSET, file.getRecord());
|
||||
|
||||
// Record our location in the file
|
||||
IASTFileLocation fileloc = name.getFileLocation();
|
||||
db.putInt(record + NODE_OFFSET_OFFSET, fileloc.getNodeOffset());
|
||||
db.putShort(record + NODE_LENGTH_OFFSET, (short) fileloc.getNodeLength());
|
||||
container.addReference(this);
|
||||
}
|
||||
|
||||
public PDOMMacroReferenceName(PDOM pdom, int nameRecord) {
|
||||
this.pdom = pdom;
|
||||
this.record = nameRecord;
|
||||
}
|
||||
|
||||
public int getRecord() {
|
||||
return record;
|
||||
}
|
||||
|
||||
private int getRecField(int offset) throws CoreException {
|
||||
return pdom.getDB().getInt(record + offset);
|
||||
}
|
||||
|
||||
private void setRecField(int offset, int fieldrec) throws CoreException {
|
||||
pdom.getDB().putInt(record + offset, fieldrec);
|
||||
}
|
||||
|
||||
public PDOMMacroContainer getContainer() throws CoreException {
|
||||
int bindingrec = getRecField(CONTAINER_REC_OFFSET);
|
||||
return new PDOMMacroContainer(pdom, bindingrec);
|
||||
}
|
||||
|
||||
private PDOMMacroReferenceName getNameField(int offset) throws CoreException {
|
||||
int namerec = getRecField(offset);
|
||||
return namerec != 0 ? new PDOMMacroReferenceName(pdom, namerec) : null;
|
||||
}
|
||||
|
||||
private void setNameField(int offset, PDOMMacroReferenceName name) throws CoreException {
|
||||
int namerec = name != null ? name.getRecord() : 0;
|
||||
setRecField(offset, namerec);
|
||||
}
|
||||
|
||||
PDOMMacroReferenceName getPrevInContainer() throws CoreException {
|
||||
return getNameField(CONTAINER_PREV_OFFSET);
|
||||
}
|
||||
|
||||
void setPrevInContainer(PDOMMacroReferenceName name) throws CoreException {
|
||||
setNameField(CONTAINER_PREV_OFFSET, name);
|
||||
}
|
||||
|
||||
public PDOMMacroReferenceName getNextInContainer() throws CoreException {
|
||||
return getNameField(CONTAINER_NEXT_OFFSET);
|
||||
}
|
||||
|
||||
void setNextInContainer(PDOMMacroReferenceName name) throws CoreException {
|
||||
setNameField(CONTAINER_NEXT_OFFSET, name);
|
||||
}
|
||||
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
int filerec = pdom.getDB().getInt(record + FILE_REC_OFFSET);
|
||||
return filerec != 0 ? new PDOMFile(pdom, filerec) : null;
|
||||
}
|
||||
|
||||
PDOMMacroReferenceName getNextInFile() throws CoreException {
|
||||
return getNameField(FILE_NEXT_OFFSET);
|
||||
}
|
||||
|
||||
void setNextInFile(PDOMMacroReferenceName name) throws CoreException {
|
||||
setNameField(FILE_NEXT_OFFSET, name);
|
||||
}
|
||||
|
||||
public char[] toCharArray() {
|
||||
try {
|
||||
return getContainer().getNameCharArray();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return CharArrayUtils.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new String(toCharArray());
|
||||
}
|
||||
|
||||
public boolean isBaseSpecifier() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean couldBePolymorphicMethodCall() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isReadAccess() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isWriteAccess() throws CoreException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isDeclaration() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isReference() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isDefinition() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public IASTFileLocation getFileLocation() {
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getFileName() {
|
||||
try {
|
||||
PDOMFile file = (PDOMFile) getFile();
|
||||
if(file!=null) {
|
||||
/*
|
||||
* We need to spec. what this method can return to know
|
||||
* how to implement this. Existing implmentations return
|
||||
* the absolute path, so here we attempt to do the same.
|
||||
*/
|
||||
URI uri = file.getLocation().getURI();
|
||||
if ("file".equals(uri.getScheme())) //$NON-NLS-1$
|
||||
return uri.getSchemeSpecificPart();
|
||||
File f = EFS.getStore(uri).toLocalFile(0, null);
|
||||
if( f != null )
|
||||
return f.getAbsolutePath();
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getStartingLineNumber() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getEndingLineNumber() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public IASTFileLocation asFileLocation() {
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getNodeLength() {
|
||||
try {
|
||||
return (pdom.getDB().getShort(record + NODE_LENGTH_OFFSET)) & 0xffff;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int getNodeOffset() {
|
||||
try {
|
||||
return pdom.getDB().getInt(record + NODE_OFFSET_OFFSET);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void delete() throws CoreException {
|
||||
// Delete from the binding chain
|
||||
PDOMMacroReferenceName prevName = getPrevInContainer();
|
||||
PDOMMacroReferenceName nextName = getNextInContainer();
|
||||
if (prevName != null)
|
||||
prevName.setNextInContainer(nextName);
|
||||
else {
|
||||
getContainer().setFirstReference(nextName);
|
||||
}
|
||||
|
||||
if (nextName != null)
|
||||
nextName.setPrevInContainer(prevName);
|
||||
|
||||
// Delete our record
|
||||
pdom.getDB().free(record);
|
||||
}
|
||||
|
||||
public IIndexFragment getIndexFragment() {
|
||||
return pdom;
|
||||
}
|
||||
|
||||
public IIndexName[] getEnclosedNames() throws CoreException {
|
||||
return IIndexName.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexFragmentBinding getBinding() throws CoreException {
|
||||
return getContainer();
|
||||
}
|
||||
|
||||
public IIndexName getEnclosingDefinition() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 QNX Software Systems and others.
|
||||
* Copyright (c) 2006, 2008 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
|
||||
|
@ -32,7 +32,10 @@ public abstract class PDOMNamedNode extends PDOMNode {
|
|||
/**
|
||||
* The size in bytes of a PDOMNamedNode record in the database.
|
||||
*/
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4;
|
||||
|
||||
private char[] fName;
|
||||
|
||||
public PDOMNamedNode(PDOM pdom, int record) {
|
||||
super(pdom, record);
|
||||
|
@ -40,12 +43,14 @@ public abstract class PDOMNamedNode extends PDOMNode {
|
|||
|
||||
public PDOMNamedNode(PDOM pdom, PDOMNode parent, char[] name) throws CoreException {
|
||||
super(pdom, parent);
|
||||
|
||||
|
||||
fName= name;
|
||||
Database db = pdom.getDB();
|
||||
db.putInt(record + NAME,
|
||||
name != null ? db.newString(name).getRecord() : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
abstract protected int getRecordSize();
|
||||
|
||||
public IString getDBName() throws CoreException {
|
||||
|
@ -61,13 +66,17 @@ public abstract class PDOMNamedNode extends PDOMNode {
|
|||
}
|
||||
|
||||
public char[] getNameCharArray() throws CoreException {
|
||||
return getDBName().getChars();
|
||||
if (fName == null) {
|
||||
fName= getDBName().getChars();
|
||||
}
|
||||
return fName;
|
||||
}
|
||||
|
||||
public boolean hasName(char[] name) throws CoreException {
|
||||
return getDBName().equals(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(PDOMLinkage linkage) throws CoreException {
|
||||
final Database db = pdom.getDB();
|
||||
final int namerec= db.getInt(record + NAME);
|
||||
|
|
|
@ -22,7 +22,6 @@ import org.eclipse.cdt.core.index.export.IExportProjectProvider;
|
|||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.LanguageManager;
|
||||
import org.eclipse.cdt.internal.core.CCoreInternals;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -87,9 +86,6 @@ public class GeneratePDOM implements ISafeRunnable {
|
|||
exportedPDOM.setProperty(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
// fake PDOM-version to that which can be safely read by the CDT-version
|
||||
// (and following CDT-versions) released at that PDOM-version.
|
||||
exportedPDOM.getDB().setVersion(PDOM.EARLIEST_FORWARD_COMPATIBLE_VERSION);
|
||||
exportedPDOM.close();
|
||||
}
|
||||
finally {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2007, 2008 Wind River Systems, 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
|
||||
|
@ -11,7 +11,6 @@
|
|||
|
||||
package org.eclipse.cdt.internal.core.pdom.indexer;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
|
@ -31,6 +30,7 @@ public abstract class AbstractPDOMIndexer implements IPDOMIndexer {
|
|||
fProperties.put(IndexerPreferences.KEY_FILES_TO_PARSE_UP_FRONT, ""); //$NON-NLS-1$
|
||||
fProperties.put(IndexerPreferences.KEY_SKIP_ALL_REFERENCES, String.valueOf(false));
|
||||
fProperties.put(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES, String.valueOf(false));
|
||||
fProperties.put(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES, String.valueOf(false));
|
||||
}
|
||||
|
||||
public ICProject getProject() {
|
||||
|
@ -46,8 +46,7 @@ public abstract class AbstractPDOMIndexer implements IPDOMIndexer {
|
|||
}
|
||||
|
||||
public boolean needsToRebuildForProperties(Properties props) {
|
||||
for (Iterator i= fProperties.entrySet().iterator(); i.hasNext();) {
|
||||
Map.Entry entry = (Map.Entry) i.next();
|
||||
for (Map.Entry<Object,Object> entry : fProperties.entrySet()) {
|
||||
String key = (String) entry.getKey();
|
||||
String myval = (String) entry.getValue();
|
||||
|
||||
|
@ -63,8 +62,7 @@ public abstract class AbstractPDOMIndexer implements IPDOMIndexer {
|
|||
|
||||
public void setProperties(Properties props) {
|
||||
// only set relevant properties as initialized in the constructor
|
||||
for (Iterator i= props.entrySet().iterator(); i.hasNext();) {
|
||||
Map.Entry entry = (Map.Entry) i.next();
|
||||
for (Map.Entry<Object,Object> entry : props.entrySet()) {
|
||||
String key = (String) entry.getKey();
|
||||
String val = (String) entry.getValue();
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems, Inc. and others.
|
||||
* Copyright (c) 2007, 2008 Wind River Systems, 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
|
||||
|
@ -11,7 +11,6 @@
|
|||
|
||||
package org.eclipse.cdt.internal.core.pdom.indexer;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
|
@ -50,6 +49,7 @@ public class IndexerPreferences {
|
|||
public static final String KEY_FILES_TO_PARSE_UP_FRONT= "filesToParseUpFront"; //$NON-NLS-1$
|
||||
public static final String KEY_SKIP_ALL_REFERENCES= "skipReferences"; //$NON-NLS-1$
|
||||
public static final String KEY_SKIP_TYPE_REFERENCES= "skipTypeReferences"; //$NON-NLS-1$
|
||||
public static final String KEY_SKIP_MACRO_REFERENCES= "skipMacroReferences"; //$NON-NLS-1$
|
||||
public static final String KEY_UPDATE_POLICY= "updatePolicy"; //$NON-NLS-1$
|
||||
|
||||
private static final String KEY_INDEXER_PREFS_SCOPE = "preferenceScope"; //$NON-NLS-1$
|
||||
|
@ -185,8 +185,7 @@ public class IndexerPreferences {
|
|||
}
|
||||
|
||||
private static void setProperties(Preferences prefs, Properties props) {
|
||||
for (Iterator i = props.entrySet().iterator(); i.hasNext();) {
|
||||
Map.Entry entry = (Map.Entry) i.next();
|
||||
for (Map.Entry<Object,Object> entry : props.entrySet()) {
|
||||
String key = (String) entry.getKey();
|
||||
String val = (String) entry.getValue();
|
||||
prefs.put(key, val);
|
||||
|
@ -314,6 +313,7 @@ public class IndexerPreferences {
|
|||
prefs.putBoolean(KEY_INDEX_ALL_FILES, false);
|
||||
prefs.putBoolean(KEY_SKIP_ALL_REFERENCES, false);
|
||||
prefs.putBoolean(KEY_SKIP_TYPE_REFERENCES, false);
|
||||
prefs.putBoolean(KEY_SKIP_MACRO_REFERENCES, false);
|
||||
prefs.put(KEY_INDEX_IMPORT_LOCATION, DEFAULT_INDEX_IMPORT_LOCATION);
|
||||
prefs.put(KEY_FILES_TO_PARSE_UP_FRONT, DEFAULT_FILES_TO_PARSE_UP_FRONT);
|
||||
}
|
||||
|
|
|
@ -65,8 +65,17 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
|
|||
if (checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES)) {
|
||||
setSkipReferences(SKIP_ALL_REFERENCES);
|
||||
}
|
||||
else if (checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES)) {
|
||||
setSkipReferences(SKIP_TYPE_REFERENCES);
|
||||
else {
|
||||
int skipRefs= 0;
|
||||
if (checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES)) {
|
||||
skipRefs |= SKIP_TYPE_REFERENCES;
|
||||
}
|
||||
if (checkProperty(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES)) {
|
||||
skipRefs |= SKIP_MACRO_REFERENCES;
|
||||
}
|
||||
if (skipRefs != 0) {
|
||||
setSkipReferences(skipRefs);
|
||||
}
|
||||
}
|
||||
if (getIndexAllFiles()) {
|
||||
setIndexFilesWithoutBuildConfiguration(true);
|
||||
|
@ -236,11 +245,13 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
|
|||
boolean allFiles= getIndexAllFiles();
|
||||
boolean skipRefs= checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES);
|
||||
boolean skipTypeRefs= skipRefs || checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES);
|
||||
boolean skipMacroRefs= skipRefs || checkProperty(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES);
|
||||
System.out.println(ident + " Options: " //$NON-NLS-1$
|
||||
+ "indexer='" + kind //$NON-NLS-1$
|
||||
+ "', parseAllFiles=" + allFiles //$NON-NLS-1$
|
||||
+ ", skipReferences=" + skipRefs //$NON-NLS-1$
|
||||
+ ", skipTypeReferences=" + skipTypeRefs //$NON-NLS-1$
|
||||
+ ", skipMacroReferences=" + skipMacroRefs //$NON-NLS-1$
|
||||
+ "."); //$NON-NLS-1$
|
||||
System.out.println(ident + " Database: " + dbSize + " bytes"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
System.out.println(ident + " Timings: " //$NON-NLS-1$
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
###############################################################################
|
||||
# Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||
# Copyright (c) 2006, 2008 Wind River Systems, 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
|
||||
|
@ -8,7 +8,6 @@
|
|||
# Contributors:
|
||||
# Markus Schorn (Wind River Systems)
|
||||
###############################################################################
|
||||
WritablePDOM_error_unknownLinkage=AST specifies unknown linkage ''{0}''
|
||||
PDOMManager_notifyJob_label=Notify Index Change Listeners
|
||||
PDOMManager_JoinIndexerTask=Join Indexer
|
||||
PDOMManager_StartJob_name=Initialize Indexing
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
* Contributors:
|
||||
* Markus Schorn - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.ui.tests.text.selection;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -47,6 +46,7 @@ public abstract class CSelectionTestsAnyIndexer extends BaseSelectionTestsIndexe
|
|||
sourceIndexerID= indexerID;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
|
@ -58,6 +58,7 @@ public abstract class CSelectionTestsAnyIndexer extends BaseSelectionTestsIndexe
|
|||
index= CCorePlugin.getIndexManager().getIndex(fCProject);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
closeAllEditors();
|
||||
CProjectHelper.delete(fCProject);
|
||||
|
@ -511,7 +512,7 @@ public abstract class CSelectionTestsAnyIndexer extends BaseSelectionTestsIndexe
|
|||
String hcode= buffers[0].toString();
|
||||
String scode= buffers[1].toString();
|
||||
IFile hfile = importFile("aheader.h", hcode);
|
||||
IFile file = importFile("source.cpp", scode);
|
||||
IFile file = importFile("source.c", scode);
|
||||
TestSourceReader.waitUntilFileIsIndexed(index, file, MAX_WAIT_TIME);
|
||||
IASTNode decl;
|
||||
int offset0, offset1;
|
||||
|
@ -520,7 +521,7 @@ public abstract class CSelectionTestsAnyIndexer extends BaseSelectionTestsIndexe
|
|||
testF3(hfile, offset1);
|
||||
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
|
||||
IEditorInput input = part.getEditorInput();
|
||||
assertEquals("source.cpp", ((FileEditorInput)input).getFile().getName());
|
||||
assertEquals("source.c", ((FileEditorInput)input).getFile().getName());
|
||||
}
|
||||
|
||||
// int myFunc();
|
||||
|
|
|
@ -6,11 +6,10 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* IBM Corporation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* QNX - Initial API and implementation
|
||||
* IBM Corporation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.ui.search;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -85,7 +84,7 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
|
|||
this.patternStr = patternStr.trim();
|
||||
|
||||
// Parse the pattern string
|
||||
List patternList = new ArrayList();
|
||||
List<Pattern> patternList = new ArrayList<Pattern>();
|
||||
StringBuffer buff = new StringBuffer();
|
||||
int n = patternStr.length();
|
||||
for (int i = 0; i < n; ++i) {
|
||||
|
@ -120,9 +119,10 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
|
|||
patternList.add(Pattern.compile(buff.toString(),Pattern.CASE_INSENSITIVE));
|
||||
}
|
||||
|
||||
pattern = (Pattern[])patternList.toArray(new Pattern[patternList.size()]);
|
||||
pattern = patternList.toArray(new Pattern[patternList.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IStatus runWithIndex(IIndex index, IProgressMonitor monitor) throws OperationCanceledException {
|
||||
try {
|
||||
IndexFilter filter= IndexFilter.ALL;
|
||||
|
@ -179,6 +179,12 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
|
|||
createMatches(index, pdomBinding);
|
||||
}
|
||||
}
|
||||
if ((flags & FIND_MACRO) != 0 && pattern.length == 1) {
|
||||
bindings = index.findMacroContainers(pattern[0], filter, monitor);
|
||||
for (IIndexBinding indexBinding : bindings) {
|
||||
createMatches(index, indexBinding);
|
||||
}
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
return e.getStatus();
|
||||
} catch (DOMException e) {
|
||||
|
@ -188,8 +194,8 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
|
|||
return Status.OK_STATUS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return Messages.format(CSearchMessages.PDOMSearchPatternQuery_PatternQuery_labelPatternInScope, super.getLabel(), patternStr, scopeDesc);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery {
|
|||
if (ast != null) {
|
||||
IASTName searchName= ast.getNodeSelector(null).findEnclosingName(selection.getOffset(), selection.getLength());
|
||||
if (searchName != null) {
|
||||
IBinding binding = searchName.resolveBinding();
|
||||
IBinding binding = index.findBinding(searchName);
|
||||
if (binding != null)
|
||||
createMatches(index, binding);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
* Markus Schorn - initial API and implementation
|
||||
* Ed Swartz (Nokia)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.ui.viewsupport;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -346,9 +345,12 @@ public class IndexUI {
|
|||
throws CoreException {
|
||||
ITranslationUnit tu= getTranslationUnit(preferProject, macro.getFileLocation());
|
||||
if (tu != null) {
|
||||
IRegion region= new Region(macro.getNodeOffset(), macro.getNodeLength());
|
||||
long timestamp= macro.getFile().getTimestamp();
|
||||
return CElementHandleFactory.create(tu, macro, region, timestamp);
|
||||
IIndexName def= macro.getDefinition();
|
||||
if (def != null) {
|
||||
IRegion region= new Region(def.getNodeOffset(), def.getNodeLength());
|
||||
long timestamp= macro.getFile().getTimestamp();
|
||||
return CElementHandleFactory.create(tu, macro, region, timestamp);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2005, 2007 IBM Corporation and others.
|
||||
* Copyright (c) 2005, 2008 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
|
||||
|
@ -39,6 +39,7 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
private Text fFilesToParseUpFront;
|
||||
private Button fSkipReferences;
|
||||
private Button fSkipTypeReferences;
|
||||
private Button fSkipMacroReferences;
|
||||
|
||||
protected AbstractIndexerPage() {
|
||||
super();
|
||||
|
@ -52,14 +53,17 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createControl(Composite parent) {
|
||||
Composite page = ControlFactory.createComposite(parent, 1);
|
||||
fAllFiles= createAllFilesButton(page);
|
||||
fSkipReferences= createSkipReferencesButton(page);
|
||||
fSkipTypeReferences= createSkipTypeReferencesButton(page);
|
||||
fSkipMacroReferences= createSkipMacroReferencesButton(page);
|
||||
fFilesToParseUpFront= createParseUpFrontTextField(page);
|
||||
|
||||
fSkipReferences.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
updateEnablement();
|
||||
}
|
||||
|
@ -85,6 +89,10 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
boolean skipTypeReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES));
|
||||
fSkipTypeReferences.setSelection(skipTypeReferences);
|
||||
}
|
||||
if (fSkipMacroReferences != null) {
|
||||
boolean skipMacroReferences= TRUE.equals(properties.get(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES));
|
||||
fSkipMacroReferences.setSelection(skipMacroReferences);
|
||||
}
|
||||
if (fFilesToParseUpFront != null) {
|
||||
String files = getNotNull(properties, IndexerPreferences.KEY_FILES_TO_PARSE_UP_FRONT);
|
||||
fFilesToParseUpFront.setText(files);
|
||||
|
@ -110,12 +118,16 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
if (fSkipTypeReferences != null) {
|
||||
props.put(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES, String.valueOf(fSkipTypeReferences.getSelection()));
|
||||
}
|
||||
if (fSkipMacroReferences != null) {
|
||||
props.put(IndexerPreferences.KEY_SKIP_MACRO_REFERENCES, String.valueOf(fSkipMacroReferences.getSelection()));
|
||||
}
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #getProperties()} will be called instead.
|
||||
*/
|
||||
@Override
|
||||
final public void performApply(IProgressMonitor monitor) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
@ -123,13 +135,19 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
/**
|
||||
* {@link #setProperties(Properties)} will be called instead.
|
||||
*/
|
||||
@Override
|
||||
final public void performDefaults() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void updateEnablement() {
|
||||
if (fSkipReferences != null && fSkipTypeReferences != null) {
|
||||
fSkipTypeReferences.setEnabled(!fSkipReferences.getSelection());
|
||||
if (fSkipReferences != null) {
|
||||
if (fSkipTypeReferences != null) {
|
||||
fSkipTypeReferences.setEnabled(!fSkipReferences.getSelection());
|
||||
}
|
||||
if (fSkipMacroReferences != null) {
|
||||
fSkipMacroReferences.setEnabled(!fSkipReferences.getSelection());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,4 +176,8 @@ public abstract class AbstractIndexerPage extends AbstractCOptionPage {
|
|||
private Button createSkipTypeReferencesButton(Composite page) {
|
||||
return ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_skipTypeReferences);
|
||||
}
|
||||
|
||||
private Button createSkipMacroReferencesButton(Composite page) {
|
||||
return ControlFactory.createCheckBox(page, DialogsMessages.AbstractIndexerPage_skipMacroReferences);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
* IBM Corporation
|
||||
* Andrew Ferguson (Symbian)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.ui.dialogs;
|
||||
|
||||
import org.eclipse.osgi.util.NLS;
|
||||
|
@ -21,6 +20,7 @@ public class DialogsMessages extends NLS {
|
|||
public static String AbstractIndexerPage_indexUpFront;
|
||||
public static String AbstractIndexerPage_skipAllReferences;
|
||||
public static String AbstractIndexerPage_skipTypeReferences;
|
||||
public static String AbstractIndexerPage_skipMacroReferences;
|
||||
public static String CacheSizeBlock_MB;
|
||||
public static String IndexerBlock_fixedBuildConfig;
|
||||
public static String IndexerStrategyBlock_activeBuildConfig;
|
||||
|
|
|
@ -16,6 +16,7 @@ PreferenceScopeBlock_preferenceLink=<a>Configure Workspace Settings...</a>
|
|||
AbstractIndexerPage_indexAllFiles=Index all files (files neither built nor included, also)
|
||||
AbstractIndexerPage_skipAllReferences=Skip all references (Call Hierarchy and Search will not work)
|
||||
AbstractIndexerPage_skipTypeReferences=Skip type references (Search for type references will not work)
|
||||
AbstractIndexerPage_skipMacroReferences=Skip macro references (Search for macro references will not work)
|
||||
AbstractIndexerPage_indexUpFront=Files to index up-front:
|
||||
CacheSizeBlock_cacheLimitGroup=Cache limits
|
||||
CacheSizeBlock_indexDatabaseCache=Index database cache:
|
||||
|
|
Loading…
Add table
Reference in a new issue