mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 09:25:31 +02:00
Fix for 193056, macros for Open Element.
This commit is contained in:
parent
61f44ef073
commit
b047d952b2
23 changed files with 637 additions and 48 deletions
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* Andrew Ferguson (Symbian) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.index.tests;
|
||||
|
||||
|
@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
|
@ -63,6 +65,10 @@ public class EmptyIndexFragment implements IIndexFragment {
|
|||
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file)
|
||||
throws CoreException {
|
||||
return IIndexFragmentInclude.EMPTY_FRAGMENT_INCLUDES_ARRAY;
|
||||
|
|
|
@ -16,6 +16,7 @@ package org.eclipse.cdt.core.browser;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
|
@ -27,9 +28,12 @@ import org.eclipse.cdt.core.dom.ast.IFunction;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||
import org.eclipse.cdt.internal.core.browser.IndexTypeReference;
|
||||
|
@ -50,6 +54,17 @@ import org.eclipse.core.runtime.Path;
|
|||
*
|
||||
*/
|
||||
public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
||||
private static int hashCode(String[] array) {
|
||||
int prime = 31;
|
||||
if (array == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int index = 0; index < array.length; index++) {
|
||||
result = prime * result + (array[index] == null ? 0 : array[index].hashCode());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private final String[] fqn;
|
||||
private final int elementType;
|
||||
private final IIndex index;
|
||||
|
@ -58,7 +73,7 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
private ITypeReference reference; // lazily constructed
|
||||
|
||||
/**
|
||||
* Creates a typeinfo suitable for the binding.
|
||||
* Creates a type info suitable for the binding.
|
||||
* @param index a non-null index in which to locate references
|
||||
* @param binding
|
||||
* @since 4.0.1
|
||||
|
@ -93,6 +108,17 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return new IndexTypeInfo(fqn, elementType, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a type info object suitable for a macro.
|
||||
* @param index a non-null index in which to locate references
|
||||
* @param binding
|
||||
* @since 4.0.1
|
||||
*/
|
||||
public static IndexTypeInfo create(IIndex index, IIndexMacro macro) {
|
||||
final char[] name= macro.getName();
|
||||
return new IndexTypeInfo(new String[] {new String(name)}, ICElement.C_MACRO, index);
|
||||
}
|
||||
|
||||
private IndexTypeInfo(String[] fqn, int elementType, IIndex index, String[] params, String returnType, ITypeReference reference) {
|
||||
Assert.isTrue(index != null);
|
||||
this.fqn= fqn;
|
||||
|
@ -190,6 +216,9 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
|
||||
public ITypeReference getResolvedReference() {
|
||||
if(reference==null) {
|
||||
if (elementType == ICElement.C_MACRO) {
|
||||
return createMacroReference();
|
||||
}
|
||||
try {
|
||||
index.acquireReadLock();
|
||||
|
||||
|
@ -235,6 +264,29 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return reference;
|
||||
}
|
||||
|
||||
private ITypeReference createMacroReference() {
|
||||
try {
|
||||
index.acquireReadLock();
|
||||
|
||||
IIndexMacro[] macros = index.findMacros(fqn[0].toCharArray(), IndexFilter.ALL_DECLARED, new NullProgressMonitor());
|
||||
if(macros.length>0) {
|
||||
for (int i = 0; i < macros.length; i++) {
|
||||
reference= createReference(macros[i]);
|
||||
if (reference != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(CoreException ce) {
|
||||
CCorePlugin.log(ce);
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt();
|
||||
} finally {
|
||||
index.releaseReadLock();
|
||||
}
|
||||
return reference;
|
||||
}
|
||||
|
||||
private IndexTypeReference createReference(IIndexBinding binding, IIndexName indexName) throws CoreException {
|
||||
IIndexFileLocation ifl = indexName.getFile().getLocation();
|
||||
String fullPath = ifl.getFullPath();
|
||||
|
@ -256,7 +308,32 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return null;
|
||||
}
|
||||
|
||||
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()
|
||||
);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ITypeReference[] getReferences() {
|
||||
if (elementType == ICElement.C_MACRO) {
|
||||
return getMacroReferences();
|
||||
}
|
||||
|
||||
List references= new ArrayList();
|
||||
try {
|
||||
index.acquireReadLock();
|
||||
|
@ -279,16 +356,51 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return sameType;
|
||||
}
|
||||
}, new NullProgressMonitor());
|
||||
// in case a file is represented multiple times in the index then we take references from
|
||||
// one of those, only.
|
||||
HashMap iflMap= new HashMap();
|
||||
for (int i = 0; i < ibs.length; i++) {
|
||||
IIndexBinding binding = ibs[i];
|
||||
IIndexName[] names;
|
||||
names= index.findNames(binding, IIndex.FIND_DEFINITIONS);
|
||||
if (names.length == 0) {
|
||||
names= index.findNames(ibs[0], IIndex.FIND_DECLARATIONS);
|
||||
names= index.findNames(binding, IIndex.FIND_DECLARATIONS);
|
||||
}
|
||||
for (int j = 0; j < names.length; j++) {
|
||||
IIndexName indexName = names[j];
|
||||
IndexTypeReference ref= createReference(binding, indexName);
|
||||
if (checkFile(iflMap, indexName.getFile())) {
|
||||
IndexTypeReference ref= createReference(binding, indexName);
|
||||
if (ref != null) {
|
||||
references.add(ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(CoreException ce) {
|
||||
CCorePlugin.log(ce);
|
||||
} catch (InterruptedException ie) {
|
||||
CCorePlugin.log(ie);
|
||||
} finally {
|
||||
index.releaseReadLock();
|
||||
}
|
||||
return (IndexTypeReference[]) references.toArray(new IndexTypeReference[references.size()]);
|
||||
}
|
||||
|
||||
|
||||
private ITypeReference[] getMacroReferences() {
|
||||
List references= new ArrayList();
|
||||
try {
|
||||
index.acquireReadLock();
|
||||
|
||||
char[] cfn= fqn[0].toCharArray();
|
||||
IIndexMacro[] ibs = index.findMacros(cfn, IndexFilter.ALL_DECLARED, new NullProgressMonitor());
|
||||
// in case a file is represented multiple times in the index then we take references from
|
||||
// one of those, only.
|
||||
HashMap iflMap= new HashMap();
|
||||
for (int i = 0; i < ibs.length; i++) {
|
||||
IIndexMacro macro= ibs[i];
|
||||
if (checkFile(iflMap, macro.getFile())) {
|
||||
IndexTypeReference ref= createReference(macro);
|
||||
if (ref != null) {
|
||||
references.add(ref);
|
||||
}
|
||||
|
@ -304,6 +416,18 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return (IndexTypeReference[]) references.toArray(new IndexTypeReference[references.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure that per file only refs from one IIndexFile object are taken.
|
||||
*/
|
||||
private boolean checkFile(HashMap iflMap, IIndexFile file) throws CoreException {
|
||||
IIndexFileLocation ifl= file.getLocation();
|
||||
IIndexFile otherFile= (IIndexFile) iflMap.get(ifl);
|
||||
if (otherFile == null) {
|
||||
iflMap.put(ifl, file);
|
||||
return true;
|
||||
}
|
||||
return otherFile.equals(file);
|
||||
}
|
||||
|
||||
public ITypeInfo getRootNamespace(boolean includeGlobalNamespace) {
|
||||
throw new PDOMNotImplementedError();
|
||||
|
@ -383,4 +507,32 @@ public class IndexTypeInfo implements ITypeInfo, IFunctionInfo {
|
|||
return returnType;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + elementType;
|
||||
result = prime * result + IndexTypeInfo.hashCode(fqn);
|
||||
result = prime * result + IndexTypeInfo.hashCode(params);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Type info objects are equal if they compute the same references.
|
||||
*/
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
IndexTypeInfo other = (IndexTypeInfo) obj;
|
||||
if (elementType != other.elementType)
|
||||
return false;
|
||||
if (!Arrays.equals(fqn, other.fqn))
|
||||
return false;
|
||||
if (!Arrays.equals(params, other.params))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.core.browser;
|
|||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.browser.TypeReference;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.internal.core.model.ext.CElementHandleFactory;
|
||||
|
@ -43,7 +44,17 @@ public class IndexTypeReference extends TypeReference {
|
|||
super(resource, project, offset, length);
|
||||
fCElement= createCElement(binding);
|
||||
}
|
||||
|
||||
public IndexTypeReference(IIndexMacro macro, IPath path, IProject project, int offset, int length) {
|
||||
super(path, project, offset, length);
|
||||
fCElement= createCElement(macro);
|
||||
}
|
||||
|
||||
public IndexTypeReference(IIndexMacro macro, IResource resource, IProject project, int offset, int length) {
|
||||
super(resource, project, offset, length);
|
||||
fCElement= createCElement(macro);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the C element handle for the given binding.
|
||||
* @param binding
|
||||
|
@ -62,6 +73,23 @@ public class IndexTypeReference extends TypeReference {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute the C element handle for the given macro.
|
||||
*/
|
||||
private ICElement createCElement(IIndexMacro macro) {
|
||||
ITranslationUnit tu= getTranslationUnit();
|
||||
if (tu != null) {
|
||||
long timestamp= tu.getResource() != null ? tu.getResource().getLocalTimeStamp() : 0;
|
||||
IRegion region= new Region(getOffset(), getLength());
|
||||
try {
|
||||
return CElementHandleFactory.create(tu, macro, region, timestamp);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.cdt.core.browser.ITypeReference#getCElements()
|
||||
*/
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* IBM Corporation
|
||||
* Andrew Ferguson (Symbian)
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.browser.util;
|
||||
|
||||
|
@ -100,12 +101,16 @@ public class IndexModelUtil {
|
|||
if (binding instanceof ICompositeType) {
|
||||
ICompositeType classType = (ICompositeType) binding;
|
||||
try {
|
||||
if(classType.getKey() == ICPPClassType.k_class) {
|
||||
switch(classType.getKey()) {
|
||||
case ICPPClassType.k_class:
|
||||
elementType = ICElement.C_CLASS;
|
||||
} else if(classType.getKey() == ICPPClassType.k_struct) {
|
||||
break;
|
||||
case ICompositeType.k_struct:
|
||||
elementType = ICElement.C_STRUCT;
|
||||
} else if(classType.getKey() == ICPPClassType.k_union) {
|
||||
break;
|
||||
case ICompositeType.k_union:
|
||||
elementType = ICElement.C_UNION;
|
||||
break;
|
||||
}
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
|
|
|
@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -55,7 +56,16 @@ public class CElementHandleFactory {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static ICElementHandle create(ITranslationUnit tu, IIndexMacro macro,
|
||||
IRegion region, long timestamp) throws CoreException {
|
||||
CElementHandle element= new MacroHandle(tu, macro);
|
||||
if (element != null && region != null) {
|
||||
element.setRangeOfID(region, timestamp);
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
|
||||
public static ICElementHandle internalCreate(ITranslationUnit tu, IBinding binding, boolean definition,
|
||||
IRegion region, long timestamp) throws CoreException, DOMException {
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 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.model.ext;
|
||||
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.IMacro;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
|
||||
public class MacroHandle extends CElementHandle implements IMacro {
|
||||
|
||||
public MacroHandle(ITranslationUnit tu, IIndexMacro macro) {
|
||||
super(tu, ICElement.C_MACRO, new String(macro.getName()));
|
||||
}
|
||||
|
||||
public String getIdentifierList() {
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
public String getTokenSequence() {
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
}
|
|
@ -59,7 +59,7 @@ public interface IIndex {
|
|||
*/
|
||||
final int FIND_DEFINITIONS = 0x2;
|
||||
/**
|
||||
* Constant to search for all declarations including definitons.
|
||||
* Constant to search for all declarations including definitions.
|
||||
*/
|
||||
final int FIND_REFERENCES = 0x4;
|
||||
/**
|
||||
|
@ -67,7 +67,7 @@ public interface IIndex {
|
|||
*/
|
||||
final int FIND_DECLARATIONS_DEFINITIONS = FIND_DECLARATIONS | FIND_DEFINITIONS;
|
||||
/**
|
||||
* Constant to search for all occurrences of a binding. This includes declarations, definitons and references.
|
||||
* Constant to search for all occurrences of a binding. This includes declarations, definitions and references.
|
||||
*/
|
||||
final int FIND_ALL_OCCURENCES = FIND_DECLARATIONS | FIND_DEFINITIONS | FIND_REFERENCES;
|
||||
|
||||
|
@ -185,6 +185,30 @@ public interface IIndex {
|
|||
*/
|
||||
public IIndexFile resolveInclude(IIndexInclude include) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for all macros with a given name.
|
||||
*
|
||||
* @param name a name, that has to be matched by the macros.
|
||||
* @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 macros matching the name.
|
||||
* @throws CoreException
|
||||
* @since 4.0.2
|
||||
*/
|
||||
public IIndexMacro[] findMacros(char[] name, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for all macros with names that start with the given prefix.
|
||||
*
|
||||
* @param prefix the prefix with which all returned macros must start
|
||||
* @param filter a filter that allows for skipping parts of the index
|
||||
* @param monitor a monitor for progress reporting and cancellation, may be <code>null</code>
|
||||
* @return an array of bindings with the prefix
|
||||
* @throws CoreException
|
||||
* @since 4.0.2
|
||||
*/
|
||||
public IIndexMacro[] findMacrosForPrefix(char[] prefix, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Searches for the binding of a name. The name may be originated by
|
||||
* an AST or by a search in an index. May return <code>null</code>.
|
||||
|
@ -243,7 +267,7 @@ public interface IIndex {
|
|||
* <pre>
|
||||
* findBindings(new char[][]{name}, filter, monitor);
|
||||
* </pre>
|
||||
* @param names an array of names, which has to be matched by the qualified name of the bindings.
|
||||
* @param name a name, which has to be matched by the qualified name of the bindings.
|
||||
* @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
|
||||
|
|
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.core.index;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||
import org.eclipse.cdt.core.parser.IMacro;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* Represents a macro stored in the index.
|
||||
|
@ -30,11 +31,28 @@ import org.eclipse.cdt.core.parser.IMacro;
|
|||
*/
|
||||
public interface IIndexMacro extends IMacro {
|
||||
|
||||
IIndexMacro[] EMPTY_INDEX_MACRO_ARRAY = new IIndexMacro[0];
|
||||
|
||||
/**
|
||||
* If available, return the file location for this macro definition
|
||||
* otherwise return null
|
||||
* @return
|
||||
*/
|
||||
IASTFileLocation getFileLocation();
|
||||
|
||||
/**
|
||||
* Returns the file this macro 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.
|
||||
*/
|
||||
public int getNodeLength();
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.eclipse.cdt.core.index.IIndexBinding;
|
|||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexInclude;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
|
@ -486,7 +487,56 @@ public class CIndex implements IIndex {
|
|||
return flatten(result);
|
||||
}
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacros(char[] name, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
return findMacros(name, false, true, filter, monitor);
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacrosForPrefix(char[] name, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
return findMacros(name, true, false, filter, monitor);
|
||||
}
|
||||
|
||||
private IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if (SPECIALCASE_SINGLES && fFragments.length==1) {
|
||||
try {
|
||||
return fFragments[0].findMacros(name, isPrefix, caseSensitive, filter, monitor);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
} else {
|
||||
if (monitor == null) {
|
||||
monitor= new NullProgressMonitor();
|
||||
}
|
||||
List result = new ArrayList();
|
||||
HashSet handledIFLs= new HashSet();
|
||||
monitor.beginTask(Messages.CIndex_FindBindingsTask_label, fFragments.length);
|
||||
for (int i = 0; i < fPrimaryFragmentCount; i++) {
|
||||
HashSet allowedFiles= new HashSet();
|
||||
try {
|
||||
IIndexMacro[] macros= fFragments[i].findMacros(name, isPrefix, caseSensitive, filter, new SubProgressMonitor(monitor, 1));
|
||||
for (int k = 0; k < macros.length; k++) {
|
||||
IIndexMacro indexMacro = macros[k];
|
||||
IIndexFile file= indexMacro.getFile();
|
||||
if (!allowedFiles.contains(file)) {
|
||||
if (handledIFLs.add(file.getLocation())) {
|
||||
allowedFiles.add(file);
|
||||
}
|
||||
else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
result.add(indexMacro);
|
||||
}
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
monitor.done();
|
||||
return (IIndexMacro[]) result.toArray(new IIndexMacro[result.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
public long getCacheHits() {
|
||||
long result= 0;
|
||||
for (int i = 0; i < fFragments.length; i++) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.eclipse.cdt.core.index.IIndexBinding;
|
|||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexInclude;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IIndexName;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -112,4 +113,12 @@ final public class EmptyCIndex implements IIndex {
|
|||
IProgressMonitor monitor) {
|
||||
return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacros(char[] name, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacrosForPrefix(char[] prefix, IndexFilter filter, IProgressMonitor monitor) {
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
|
@ -176,6 +177,12 @@ public interface IIndexFragment {
|
|||
*/
|
||||
IIndexFragmentBinding[] findBindingsForPrefix(char[] prefix, boolean filescope, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns all macros with the given prefix or name, accepted by the given filter
|
||||
* @param monitor to report progress, may be <code>null</code>
|
||||
*/
|
||||
IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Returns the linkages that are contained in this fragment
|
||||
* @return
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.eclipse.cdt.core.index.IIndexBinding;
|
|||
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.IIndexName;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||
|
@ -51,11 +52,14 @@ import org.eclipse.cdt.internal.core.pdom.db.Database;
|
|||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.ApplyVisitor;
|
||||
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.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.PDOMName;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -71,17 +75,16 @@ import org.eclipse.core.runtime.Status;
|
|||
* @author Doug Schaefer
|
||||
*/
|
||||
public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
||||
protected Database db;
|
||||
|
||||
/**
|
||||
* Identifier for PDOM format
|
||||
* @see IIndexFragment#PROPERTY_FRAGMENT_FORMAT_ID
|
||||
*/
|
||||
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 = 37;
|
||||
public static final int CURRENT_VERSION = 38;
|
||||
public static final int MIN_SUPPORTED_VERSION= 36;
|
||||
public static final int MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX= 37; // to be removed in 4.1
|
||||
public static final int MIN_VERSION_TO_WRITE_MACROS_INDEX= 38; // to be removed in 4.1
|
||||
|
||||
/*
|
||||
* PDOM internal format history
|
||||
|
@ -126,24 +129,33 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
* 35 - add scanner configuration hash-code (62366)
|
||||
* #36#- changed chunk size back to 4K (184892) - <<CDT 4.0>>
|
||||
* #37#- added index for nested bindings (189811), compatible with version 36 - <<CDT 4.0.1>>
|
||||
* #38#- added btree for macros (193056), compatible with version 36 and 37 - <<CDT 4.0.2>>
|
||||
*/
|
||||
|
||||
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 HAS_NESTED_BINDING_BTREES= Database.DATA_AREA + 12;
|
||||
public static final int END= Database.DATA_AREA + 13;
|
||||
public static final int HAS_MACRO_BTREES= Database.DATA_AREA + 13;
|
||||
// 2-bytes of freedom
|
||||
public static final int MACRO_BTREE= Database.DATA_AREA + 16;
|
||||
public static final int END= Database.DATA_AREA + 20;
|
||||
static {
|
||||
assert END <= Database.CHUNK_SIZE;
|
||||
}
|
||||
|
||||
// Local caches
|
||||
protected Database db;
|
||||
private BTree fileIndex;
|
||||
private BTree fMacroIndex= null;
|
||||
private Map fLinkageIDCache = new HashMap();
|
||||
private File fPath;
|
||||
private IIndexLocationConverter locationConverter;
|
||||
private Map fPDOMLinkageFactoryCache;
|
||||
private boolean fHasBTreeForNestedBindings;
|
||||
private boolean fHasBTreeForMacros;
|
||||
private HashMap fResultCache= new HashMap();
|
||||
|
||||
|
||||
public PDOM(File dbPath, IIndexLocationConverter locationConverter, Map linkageFactoryMappings) throws CoreException {
|
||||
this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings);
|
||||
|
@ -168,18 +180,28 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
|
||||
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) {
|
||||
readLinkages();
|
||||
fHasBTreeForNestedBindings= db.getByte(HAS_NESTED_BINDING_BTREES) == 1;
|
||||
fHasBTreeForMacros= db.getByte(HAS_MACRO_BTREES) == 1;
|
||||
|
||||
// new PDOM with version ready to write nested bindings index
|
||||
if (version >= MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
|
||||
if (!fHasBTreeForNestedBindings && !isPermanentlyReadOnly()) {
|
||||
fHasBTreeForNestedBindings= true;
|
||||
db.putByte(HAS_NESTED_BINDING_BTREES, (byte) 1);
|
||||
if (!isPermanentlyReadOnly()) {
|
||||
if (version >= MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
|
||||
if (!fHasBTreeForNestedBindings) {
|
||||
fHasBTreeForNestedBindings= true;
|
||||
db.putByte(HAS_NESTED_BINDING_BTREES, (byte) 1);
|
||||
}
|
||||
}
|
||||
if (version >= MIN_VERSION_TO_WRITE_MACROS_INDEX) {
|
||||
if (!fHasBTreeForMacros) {
|
||||
fHasBTreeForMacros= true;
|
||||
db.putByte(HAS_MACRO_BTREES, (byte) 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -281,7 +303,9 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
// Clear out the database, everything is set to zero.
|
||||
db.clear(CURRENT_VERSION);
|
||||
db.putByte(HAS_NESTED_BINDING_BTREES, (byte) 1);
|
||||
db.putByte(HAS_MACRO_BTREES, (byte) 1);
|
||||
fHasBTreeForNestedBindings= true;
|
||||
fHasBTreeForMacros= true;
|
||||
clearCaches();
|
||||
}
|
||||
|
||||
|
@ -550,7 +574,6 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
private long lastWriteAccess= 0;
|
||||
private long lastReadAccess= 0;
|
||||
|
||||
private HashMap fResultCache= new HashMap();
|
||||
|
||||
public void acquireReadLock() throws InterruptedException {
|
||||
synchronized (mutex) {
|
||||
|
@ -772,6 +795,37 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
return (IIndexFragmentBinding[]) result.toArray(new IIndexFragmentBinding[result.size()]);
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacros(char[] prefix, boolean isPrefix, boolean isCaseSensitive, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if (!fHasBTreeForMacros) {
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
ArrayList result= new ArrayList();
|
||||
MacroCollector visitor = new MacroCollector(this, prefix, isPrefix, isCaseSensitive);
|
||||
visitor.setMonitor(monitor);
|
||||
try {
|
||||
getMacroIndex().accept(visitor);
|
||||
result.addAll(visitor.getMacroList());
|
||||
}
|
||||
catch (OperationCanceledException e) {
|
||||
}
|
||||
return (IIndexMacro[]) 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;
|
||||
|
@ -789,6 +843,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
|||
|
||||
private void clearCaches() {
|
||||
fileIndex= null;
|
||||
fMacroIndex= null;
|
||||
fLinkageIDCache.clear();
|
||||
clearResultCache();
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexFileLocation;
|
||||
import org.eclipse.cdt.core.index.IIndexLinkage;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||
|
@ -47,6 +48,13 @@ public class PDOMProxy implements IPDOM {
|
|||
}
|
||||
}
|
||||
|
||||
public IIndexMacro[] findMacros(char[] name, boolean isPrefix, boolean caseSensitive,
|
||||
IndexFilter filter, IProgressMonitor monitor) throws CoreException {
|
||||
if (fDelegate != null)
|
||||
return fDelegate.findMacros(name, isPrefix, caseSensitive, filter, monitor);
|
||||
return IIndexMacro.EMPTY_INDEX_MACRO_ARRAY;
|
||||
}
|
||||
|
||||
public synchronized IIndexFragmentBinding adaptBinding(IBinding binding) throws CoreException {
|
||||
if (fDelegate != null)
|
||||
return fDelegate.adaptBinding(binding);
|
||||
|
|
|
@ -65,7 +65,30 @@ public class FindBinding {
|
|||
return cmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class MacroBTreeComparator implements IBTreeComparator {
|
||||
final private PDOM fPDom;
|
||||
|
||||
public MacroBTreeComparator(PDOM pdom) {
|
||||
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;
|
||||
}
|
||||
private int compare(IString nameInDB, IString nameInDB2) throws CoreException {
|
||||
return nameInDB.compareCompatibleWithIgnoreCase(nameInDB2);
|
||||
}
|
||||
}
|
||||
|
||||
public static PDOMBinding findBinding(BTree btree, final PDOM pdom, final char[]name, final int[] constants) throws CoreException {
|
||||
final PDOMBinding[] result = new PDOMBinding[1];
|
||||
btree.accept(new IBTreeVisitor() {
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 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 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;
|
||||
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 MacroCollector implements IBTreeVisitor {
|
||||
private final PDOM pdom;
|
||||
private final char[] name;
|
||||
private final boolean prefixLookup;
|
||||
private final boolean caseSensitive;
|
||||
private IProgressMonitor monitor= null;
|
||||
private int monitorCheckCounter= 0;
|
||||
|
||||
private List macros = new ArrayList();
|
||||
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
this.name= name;
|
||||
this.pdom= pdom;
|
||||
this.prefixLookup= prefixLookup;
|
||||
this.caseSensitive= caseSensitive;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows to cancel a visit. If set a visit may throw an OperationCancelledException.
|
||||
* @since 4.0
|
||||
*/
|
||||
public void setMonitor(IProgressMonitor pm) {
|
||||
monitor= pm;
|
||||
}
|
||||
|
||||
final public int compare(int record) throws CoreException {
|
||||
if (monitor != null)
|
||||
checkCancelled();
|
||||
IString name= PDOMMacro.getNameInDB(pdom, record);
|
||||
return compare(name);
|
||||
}
|
||||
|
||||
private int compare(IString rhsName) throws CoreException {
|
||||
int cmp;
|
||||
if (prefixLookup) {
|
||||
cmp= rhsName.comparePrefix(name, false);
|
||||
if(caseSensitive) {
|
||||
cmp= cmp==0 ? rhsName.comparePrefix(name, true) : cmp;
|
||||
}
|
||||
return cmp;
|
||||
} else {
|
||||
if(caseSensitive) {
|
||||
cmp= rhsName.compareCompatibleWithIgnoreCase(name);
|
||||
}
|
||||
else {
|
||||
cmp= rhsName.compare(name, false);
|
||||
}
|
||||
}
|
||||
return cmp;
|
||||
}
|
||||
|
||||
final public boolean visit(int record) throws CoreException {
|
||||
if (monitor != null)
|
||||
checkCancelled();
|
||||
|
||||
if (record == 0)
|
||||
return true;
|
||||
|
||||
macros.add(new PDOMMacro(pdom, record));
|
||||
return true; // look for more
|
||||
}
|
||||
|
||||
final public List getMacroList() {
|
||||
return macros;
|
||||
}
|
||||
|
||||
private void checkCancelled() {
|
||||
if (++monitorCheckCounter % 0x1000 == 0 && monitor.isCanceled()) {
|
||||
throw new OperationCanceledException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -203,6 +203,7 @@ public class PDOMFile implements IIndexFragmentFile {
|
|||
lastMacro.setNextMacro(pdomMacro);
|
||||
}
|
||||
lastMacro= pdomMacro;
|
||||
pdom.afterAddMacro(pdomMacro);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -259,6 +260,7 @@ 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;
|
||||
|
|
|
@ -92,7 +92,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
}
|
||||
|
||||
public void delete() throws CoreException {
|
||||
getNameInDB().delete();
|
||||
getNameInDB(pdom, record).delete();
|
||||
getExpansionInDB().delete();
|
||||
PDOMMacroParameter param = getFirstParameter();
|
||||
if (param != null)
|
||||
|
@ -100,7 +100,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
pdom.getDB().free(record);
|
||||
}
|
||||
|
||||
public IString getNameInDB() throws CoreException {
|
||||
public static IString getNameInDB(PDOM pdom, int record) throws CoreException {
|
||||
Database db = pdom.getDB();
|
||||
int rec = db.getInt(record + NAME);
|
||||
return db.getString(rec);
|
||||
|
@ -140,6 +140,15 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
public IASTFileLocation getFileLocation() {
|
||||
return PDOMMacro.this;
|
||||
}
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
return PDOMMacro.this.getFile();
|
||||
}
|
||||
public int getNodeOffset() {
|
||||
return PDOMMacro.this.getNodeOffset();
|
||||
}
|
||||
public int getNodeLength() {
|
||||
return PDOMMacro.this.getNodeLength();
|
||||
}
|
||||
}
|
||||
|
||||
private class FunctionStylePDOMMacro extends FunctionStyleMacro implements IIndexMacro {
|
||||
|
@ -152,6 +161,15 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
public IASTFileLocation getFileLocation() {
|
||||
return PDOMMacro.this;
|
||||
}
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
return PDOMMacro.this.getFile();
|
||||
}
|
||||
public int getNodeOffset() {
|
||||
return PDOMMacro.this.getNodeOffset();
|
||||
}
|
||||
public int getNodeLength() {
|
||||
return PDOMMacro.this.getNodeLength();
|
||||
}
|
||||
}
|
||||
|
||||
private char[] getMacroExpansion() {
|
||||
|
@ -169,7 +187,7 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
}
|
||||
|
||||
private void rebuildMacro() throws CoreException {
|
||||
char[] name = getNameInDB().getChars();
|
||||
char[] name = getNameInDB(pdom, record).getChars();
|
||||
PDOMMacroParameter param = getFirstParameter();
|
||||
if (param != null) {
|
||||
List paramList = new ArrayList();
|
||||
|
@ -205,12 +223,11 @@ public class PDOMMacro implements IIndexMacro, IASTFileLocation {
|
|||
|
||||
public char[] getName() {
|
||||
try {
|
||||
rebuildMacro();
|
||||
return getNameInDB(pdom, record).getChars();
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return new char[] { ' ' };
|
||||
}
|
||||
return macro.getName();
|
||||
}
|
||||
|
||||
public IIndexFile getFile() throws CoreException {
|
||||
|
|
|
@ -80,9 +80,10 @@ public class GeneratePDOM implements ISafeRunnable {
|
|||
exportedPDOM.setProperty((String) entry.getKey(), (String) entry.getValue());
|
||||
}
|
||||
}
|
||||
// fake version of pdom, such that it works with CDT 4.0.0, also.
|
||||
if (PDOM.CURRENT_VERSION == PDOM.MIN_VERSION_TO_WRITE_NESTED_BINDINGS_INDEX) {
|
||||
exportedPDOM.getDB().setVersion(PDOM.CURRENT_VERSION-1);
|
||||
// fake version of pdom, such that it works with CDT 4.0.0 and CDT 4.0.1, also.
|
||||
// can be removed in CDT 5.0
|
||||
if (PDOM.CURRENT_VERSION == PDOM.MIN_VERSION_TO_WRITE_MACROS_INDEX) {
|
||||
exportedPDOM.getDB().setVersion(PDOM.CURRENT_VERSION-2);
|
||||
}
|
||||
exportedPDOM.close();
|
||||
}
|
||||
|
|
|
@ -12,9 +12,8 @@
|
|||
|
||||
package org.eclipse.cdt.internal.ui.browser.opentype;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
|
@ -40,10 +39,13 @@ import org.eclipse.cdt.core.CCorePlugin;
|
|||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||
import org.eclipse.cdt.core.browser.IndexTypeInfo;
|
||||
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.index.IIndex;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
import org.eclipse.cdt.core.index.IIndexMacro;
|
||||
import org.eclipse.cdt.core.index.IndexFilter;
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog;
|
||||
|
||||
import org.eclipse.cdt.internal.core.browser.util.IndexModelUtil;
|
||||
|
@ -232,24 +234,40 @@ public class ElementSelectionDialog extends TypeSelectionDialog {
|
|||
if (monitor.isCanceled()) {
|
||||
return null;
|
||||
}
|
||||
List types = new ArrayList();
|
||||
HashSet types = new HashSet();
|
||||
if(prefix.length > 0 || fAllowEmptyPrefix) {
|
||||
final IndexFilter filter= new IndexFilter() {
|
||||
public boolean acceptBinding(IBinding binding) throws CoreException {
|
||||
if (isVisibleType(IndexModelUtil.getElementType(binding))) {
|
||||
if (IndexFilter.ALL_DECLARED.acceptBinding(binding)) {
|
||||
// until we have correctly modeled file-local variables and functions, don't show them.
|
||||
return !((IIndexBinding) binding).isFileLocal();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
try {
|
||||
IIndex index = CCorePlugin.getIndexManager().getIndex(CoreModel.getDefault().getCModel().getCProjects());
|
||||
try {
|
||||
index.acquireReadLock();
|
||||
IIndexBinding[] bindings= index.findBindingsForPrefix(prefix, false, IndexFilter.ALL_DECLARED, monitor);
|
||||
IIndexBinding[] bindings= index.findBindingsForPrefix(prefix, false, filter, monitor);
|
||||
for(int i=0; i<bindings.length; i++) {
|
||||
if (i % 0x1000 == 0 && monitor.isCanceled()) {
|
||||
return null;
|
||||
}
|
||||
IIndexBinding binding = bindings[i];
|
||||
// until we have correctly modeled file-local variables and functions, don't show them.
|
||||
if (!binding.isFileLocal()) {
|
||||
final int elementType = IndexModelUtil.getElementType(binding);
|
||||
if (isVisibleType(elementType)) {
|
||||
types.add(IndexTypeInfo.create(index, binding));
|
||||
final IndexTypeInfo typeinfo = IndexTypeInfo.create(index, bindings[i]);
|
||||
types.add(typeinfo);
|
||||
}
|
||||
|
||||
if (isVisibleType(ICElement.C_MACRO)) {
|
||||
IIndexMacro[] macros= index.findMacrosForPrefix(prefix, IndexFilter.ALL_DECLARED, monitor);
|
||||
for(int i=0; i<macros.length; i++) {
|
||||
if (i % 0x1000 == 0 && monitor.isCanceled()) {
|
||||
return null;
|
||||
}
|
||||
final IndexTypeInfo typeinfo = IndexTypeInfo.create(index, macros[i]);
|
||||
types.add(typeinfo);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* QNX Software Systems - adapted for use in CDT
|
||||
* Andrew Ferguson (Symbian)
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.ui.browser.typeinfo;
|
||||
|
||||
|
@ -52,6 +53,7 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
|||
private static final Image ENUM_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_ENUMERATION);
|
||||
private static final Image FUNCTION_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_FUNCTION);
|
||||
private static final Image VARIABLE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_VARIABLE);
|
||||
private static final Image MACRO_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_MACRO);
|
||||
private static final Image UNKNOWN_TYPE_ICON= CPluginImages.get(CPluginImages.IMG_OBJS_UNKNOWN_TYPE);
|
||||
|
||||
private int fFlags;
|
||||
|
@ -214,6 +216,9 @@ public class TypeInfoLabelProvider extends LabelProvider {
|
|||
|
||||
case ICElement.C_VARIABLE:
|
||||
return VARIABLE_ICON;
|
||||
|
||||
case ICElement.C_MACRO:
|
||||
return MACRO_ICON;
|
||||
|
||||
default:
|
||||
return UNKNOWN_TYPE_ICON;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* QNX Software Systems - initial API and implementation
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.ui.browser.typeinfo;
|
||||
|
||||
|
@ -32,6 +33,7 @@ public final class TypeInfoMessages extends NLS {
|
|||
public static String TypeSelectionDialog_filterUnions;
|
||||
public static String TypeSelectionDialog_filterFunctions;
|
||||
public static String TypeSelectionDialog_filterVariables;
|
||||
public static String TypeSelectionDialog_filterMacros;
|
||||
public static String TypeSelectionDialog_filterLowLevelTypes;
|
||||
public static String TypeInfoLabelProvider_default_filename;
|
||||
public static String TypeInfoLabelProvider_globalScope;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
# QNX Software Systems - Initial API and implementation
|
||||
# Anton Leherbauer (Wind River Systems)
|
||||
# IBM Corporation
|
||||
# Markus Schorn (Wind River Systems)
|
||||
###############################################################################
|
||||
|
||||
TypeSelectionDialog_lowerLabel=&Qualified name and location:
|
||||
|
@ -25,6 +26,7 @@ TypeSelectionDialog_filterEnums=&Enumeration
|
|||
TypeSelectionDialog_filterUnions=&Union
|
||||
TypeSelectionDialog_filterFunctions=&Function
|
||||
TypeSelectionDialog_filterVariables=&Variable
|
||||
TypeSelectionDialog_filterMacros=M&acros
|
||||
|
||||
TypeSelectionDialog_filterLowLevelTypes=Show &low-level elements (names beginning with '_')
|
||||
|
||||
|
|
|
@ -20,14 +20,6 @@ import java.util.HashSet;
|
|||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
|
||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||
import org.eclipse.cdt.core.browser.ITypeReference;
|
||||
import org.eclipse.cdt.core.browser.IndexTypeInfo;
|
||||
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.internal.ui.util.StringMatcher;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.jface.dialogs.IDialogSettings;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.accessibility.AccessibleAdapter;
|
||||
|
@ -46,6 +38,16 @@ import org.eclipse.swt.widgets.Text;
|
|||
import org.eclipse.ui.dialogs.FilteredList;
|
||||
import org.eclipse.ui.dialogs.TwoPaneElementSelector;
|
||||
|
||||
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
|
||||
import org.eclipse.cdt.core.browser.ITypeInfo;
|
||||
import org.eclipse.cdt.core.browser.ITypeReference;
|
||||
import org.eclipse.cdt.core.browser.IndexTypeInfo;
|
||||
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.util.StringMatcher;
|
||||
|
||||
|
||||
/**
|
||||
* A dialog to select a type from a list of types.
|
||||
|
@ -208,6 +210,7 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
private static final String SETTINGS_SHOW_UNIONS = "show_unions"; //$NON-NLS-1$
|
||||
private static final String SETTINGS_SHOW_FUNCTIONS = "show_functions"; //$NON-NLS-1$
|
||||
private static final String SETTINGS_SHOW_VARIABLES = "show_variables"; //$NON-NLS-1$
|
||||
private static final String SETTINGS_SHOW_MACROS = "show_macros"; //$NON-NLS-1$
|
||||
private static final String SETTINGS_SHOW_LOWLEVEL = "show_lowlevel"; //$NON-NLS-1$
|
||||
|
||||
private static final TypeInfoLabelProvider fElementRenderer = new TypeInfoLabelProvider(
|
||||
|
@ -221,7 +224,7 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
|
||||
private static final int[] ALL_TYPES = { ICElement.C_NAMESPACE, ICElement.C_CLASS,
|
||||
ICElement.C_STRUCT, ICElement.C_TYPEDEF, ICElement.C_ENUMERATION,
|
||||
ICElement.C_UNION, ICElement.C_FUNCTION, ICElement.C_VARIABLE };
|
||||
ICElement.C_UNION, ICElement.C_FUNCTION, ICElement.C_VARIABLE, ICElement.C_MACRO };
|
||||
|
||||
// the filter matcher contains state information, must not be static
|
||||
private final TypeFilterMatcher fFilterMatcher = new TypeFilterMatcher();
|
||||
|
@ -378,6 +381,9 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
case ICElement.C_VARIABLE:
|
||||
name = TypeInfoMessages.TypeSelectionDialog_filterVariables;
|
||||
break;
|
||||
case ICElement.C_MACRO:
|
||||
name = TypeInfoMessages.TypeSelectionDialog_filterMacros;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -507,6 +513,7 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
section.put(SETTINGS_SHOW_UNIONS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_UNION)));
|
||||
section.put(SETTINGS_SHOW_FUNCTIONS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_FUNCTION)));
|
||||
section.put(SETTINGS_SHOW_VARIABLES, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_VARIABLE)));
|
||||
section.put(SETTINGS_SHOW_MACROS, fFilterMatcher.getVisibleTypes().contains(new Integer(ICElement.C_MACRO)));
|
||||
section.put(SETTINGS_SHOW_LOWLEVEL, fFilterMatcher.getShowLowLevelTypes());
|
||||
}
|
||||
|
||||
|
@ -522,6 +529,7 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
section.put(SETTINGS_SHOW_UNIONS, true);
|
||||
section.put(SETTINGS_SHOW_FUNCTIONS, true);
|
||||
section.put(SETTINGS_SHOW_VARIABLES, true);
|
||||
section.put(SETTINGS_SHOW_MACROS, true);
|
||||
section.put(SETTINGS_SHOW_LOWLEVEL, false);
|
||||
}
|
||||
|
||||
|
@ -582,6 +590,11 @@ public class TypeSelectionDialog extends TwoPaneElementSelector {
|
|||
if (fKnownTypes.contains(typeObject))
|
||||
fFilterMatcher.getVisibleTypes().add(typeObject);
|
||||
}
|
||||
if (section.getBoolean(SETTINGS_SHOW_MACROS)) {
|
||||
Integer typeObject = new Integer(ICElement.C_MACRO);
|
||||
if (fKnownTypes.contains(typeObject))
|
||||
fFilterMatcher.getVisibleTypes().add(typeObject);
|
||||
}
|
||||
if (showLowLevelFilter()) {
|
||||
fFilterMatcher.setShowLowLevelTypes(section.getBoolean(SETTINGS_SHOW_LOWLEVEL));
|
||||
} else {
|
||||
|
|
Loading…
Add table
Reference in a new issue