mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
Propogate PDOM changes to support search down the PDOM hierarchy.
This commit is contained in:
parent
d1c5dd658c
commit
cec3d1b1ef
28 changed files with 265 additions and 1591 deletions
|
@ -47,7 +47,6 @@ Export-Package: org.eclipse.cdt.core,
|
||||||
org.eclipse.cdt.internal.core.pdom.dom,
|
org.eclipse.cdt.internal.core.pdom.dom,
|
||||||
org.eclipse.cdt.internal.core.pdom.dom.c,
|
org.eclipse.cdt.internal.core.pdom.dom.c,
|
||||||
org.eclipse.cdt.internal.core.pdom.dom.cpp,
|
org.eclipse.cdt.internal.core.pdom.dom.cpp,
|
||||||
org.eclipse.cdt.internal.core.pdom.indexer.ctags,
|
|
||||||
org.eclipse.cdt.internal.core.pdom.indexer.fast,
|
org.eclipse.cdt.internal.core.pdom.indexer.fast,
|
||||||
org.eclipse.cdt.internal.core.pdom.indexer.nulli,
|
org.eclipse.cdt.internal.core.pdom.indexer.nulli,
|
||||||
org.eclipse.cdt.internal.core.util,
|
org.eclipse.cdt.internal.core.util,
|
||||||
|
|
|
@ -67,6 +67,9 @@ public class AllTypesCache {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
|
|
||||||
public List getTypes() {
|
public List getTypes() {
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ import org.eclipse.core.runtime.IAdaptable;
|
||||||
public interface IPDOM extends IAdaptable {
|
public interface IPDOM extends IAdaptable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find all the bindings that match the pattern.
|
* Find all the bindings whose names that match the pattern.
|
||||||
*
|
*
|
||||||
* @param pattern
|
* @param pattern
|
||||||
* @return
|
* @return
|
||||||
|
@ -34,6 +34,15 @@ public interface IPDOM extends IAdaptable {
|
||||||
*/
|
*/
|
||||||
public IBinding[] findBindings(Pattern pattern) throws CoreException;
|
public IBinding[] findBindings(Pattern pattern) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find all bindings whose qualified names match the array of patterns.
|
||||||
|
*
|
||||||
|
* @param pattern
|
||||||
|
* @return
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
public IBinding[] findBindings(Pattern[] pattern) throws CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively visit the nodes in this PDOM using the given visitor.
|
* Recursively visit the nodes in this PDOM using the given visitor.
|
||||||
*
|
*
|
||||||
|
|
|
@ -24,9 +24,17 @@ public interface IPDOMVisitor {
|
||||||
* this node, or false to skip to the next sibling of this node.
|
* this node, or false to skip to the next sibling of this node.
|
||||||
* Throw CoreException to stop the visit.
|
* Throw CoreException to stop the visit.
|
||||||
*
|
*
|
||||||
* @param node
|
* @param node being visited
|
||||||
* @return
|
* @return whether to visit children
|
||||||
*/
|
*/
|
||||||
public boolean visit(IPDOMNode node) throws CoreException;
|
public boolean visit(IPDOMNode node) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All children have been visited, about to go back to the parent.
|
||||||
|
*
|
||||||
|
* @param node that has just completed visitation
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
public void leave(IPDOMNode node) throws CoreException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ import java.util.regex.Pattern;
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
||||||
import org.eclipse.cdt.core.dom.IPDOM;
|
import org.eclipse.cdt.core.dom.IPDOM;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMResolver;
|
import org.eclipse.cdt.core.dom.IPDOMResolver;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMWriter;
|
import org.eclipse.cdt.core.dom.IPDOMWriter;
|
||||||
|
@ -249,14 +250,60 @@ public class PDOM extends PlatformObject
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class BindingFinder implements IPDOMVisitor {
|
||||||
|
private final Pattern[] pattern;
|
||||||
|
|
||||||
|
private final IBinding[] match;
|
||||||
|
private int level = 0;
|
||||||
|
private List bindings = new ArrayList();
|
||||||
|
|
||||||
|
public BindingFinder(Pattern[] pattern) {
|
||||||
|
this.pattern = pattern;
|
||||||
|
match = new IBinding[pattern.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean visit(IPDOMNode node) throws CoreException {
|
||||||
|
if (node instanceof IBinding) {
|
||||||
|
IBinding binding = (IBinding)node;
|
||||||
|
if (pattern[level].matcher(binding.getName()).matches()) {
|
||||||
|
if (level < pattern.length - 1) {
|
||||||
|
match[level++] = binding;
|
||||||
|
} else {
|
||||||
|
bindings.add(binding);
|
||||||
|
// Only visit children if using simple name
|
||||||
|
return pattern.length == 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
if (node instanceof IBinding) {
|
||||||
|
if (level > 0 && match[level - 1] == (IBinding)node)
|
||||||
|
// pop the stack
|
||||||
|
--level;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] getBindings() {
|
||||||
|
return (IBinding[])bindings.toArray(new IBinding[bindings.size()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public IBinding[] findBindings(Pattern pattern) throws CoreException {
|
public IBinding[] findBindings(Pattern pattern) throws CoreException {
|
||||||
List bindings = new ArrayList();
|
return findBindings(new Pattern[] { pattern });
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] findBindings(Pattern[] pattern) throws CoreException {
|
||||||
|
BindingFinder finder = new BindingFinder(pattern);
|
||||||
PDOMLinkage linkage = getFirstLinkage();
|
PDOMLinkage linkage = getFirstLinkage();
|
||||||
while (linkage != null) {
|
while (linkage != null) {
|
||||||
linkage.findBindings(pattern, bindings);
|
linkage.accept(finder);
|
||||||
linkage = linkage.getNextLinkage();
|
linkage = linkage.getNextLinkage();
|
||||||
}
|
}
|
||||||
return (IBinding[])bindings.toArray(new IBinding[bindings.size()]);
|
return finder.getBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PDOMLinkage getLinkage(ILanguage language) throws CoreException {
|
public PDOMLinkage getLinkage(ILanguage language) throws CoreException {
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.IElementChangedListener;
|
import org.eclipse.cdt.core.model.IElementChangedListener;
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.ctags.CtagsIndexer;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.ProjectScope;
|
import org.eclipse.core.resources.ProjectScope;
|
||||||
|
@ -199,7 +198,7 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if Indexer still null schedule a job to get it
|
// if Indexer still null schedule a job to get it
|
||||||
if (indexerId == null || indexerId.equals(CtagsIndexer.ID))
|
if (indexerId == null || indexerId.equals("org.eclipse.cdt.core.ctagsindexer")) //$NON-NLS-1$
|
||||||
// make it the default, ctags is gone
|
// make it the default, ctags is gone
|
||||||
indexerId = getDefaultIndexerId();
|
indexerId = getDefaultIndexerId();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2006 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
public final class FindBindingsInBTree extends PDOMNamedNode.NodeFinder {
|
||||||
|
|
||||||
|
private List bindings = new ArrayList();
|
||||||
|
private final int[] desiredType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches all types.
|
||||||
|
*
|
||||||
|
* @param pdom
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
public FindBindingsInBTree(PDOM pdom, char[] name) {
|
||||||
|
this(pdom, name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match a specific type.
|
||||||
|
*
|
||||||
|
* @param pdom
|
||||||
|
* @param name
|
||||||
|
* @param desiredType
|
||||||
|
*/
|
||||||
|
public FindBindingsInBTree(PDOM pdom, char[] name, int desiredType) {
|
||||||
|
this(pdom, name, new int[] { desiredType });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match a collection of types.
|
||||||
|
*
|
||||||
|
* @param pdom
|
||||||
|
* @param name
|
||||||
|
* @param desiredType
|
||||||
|
*/
|
||||||
|
public FindBindingsInBTree(PDOM pdom, char[] name, int[] desiredType) {
|
||||||
|
super(pdom, name);
|
||||||
|
this.desiredType = desiredType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean visit(int record) throws CoreException {
|
||||||
|
if (record == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
PDOMBinding tBinding = pdom.getBinding(record);
|
||||||
|
if (!tBinding.hasName(name))
|
||||||
|
// no more bindings with our desired name
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (desiredType == null) {
|
||||||
|
bindings.add(tBinding);
|
||||||
|
return true; // look for more
|
||||||
|
} else {
|
||||||
|
int nodeType = tBinding.getNodeType();
|
||||||
|
for (int i = 0; i < desiredType.length; ++i)
|
||||||
|
if (nodeType == desiredType[i]) {
|
||||||
|
bindings.add(tBinding);
|
||||||
|
return true; // look for more
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// wrong type, try again
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] getBinding() {
|
||||||
|
return (IBinding[])bindings.toArray(new IBinding[bindings.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -11,10 +11,6 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
@ -37,35 +33,6 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
*/
|
*/
|
||||||
public abstract class PDOMLinkage extends PDOMNamedNode {
|
public abstract class PDOMLinkage extends PDOMNamedNode {
|
||||||
|
|
||||||
protected static final class MatchBinding implements IBTreeVisitor {
|
|
||||||
private final PDOM pdom;
|
|
||||||
private final List bindings;
|
|
||||||
private final Pattern pattern;
|
|
||||||
|
|
||||||
public MatchBinding(PDOM pdom, Pattern pattern, List bindings) {
|
|
||||||
this.pdom = pdom;
|
|
||||||
this.bindings = bindings;
|
|
||||||
this.pattern = pattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean visit(int record) throws CoreException {
|
|
||||||
if (record == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// TODO of course do something smarter here
|
|
||||||
PDOMBinding binding = pdom.getBinding(record);
|
|
||||||
if (binding != null) {
|
|
||||||
Matcher matcher = pattern.matcher(binding.getName());
|
|
||||||
if (matcher.matches())
|
|
||||||
bindings.add(binding);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
public int compare(int record) throws CoreException {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// record offsets
|
// record offsets
|
||||||
private static final int ID_OFFSET = PDOMNamedNode.RECORD_SIZE + 0;
|
private static final int ID_OFFSET = PDOMNamedNode.RECORD_SIZE + 0;
|
||||||
private static final int NEXT_OFFSET = PDOMNamedNode.RECORD_SIZE + 4;
|
private static final int NEXT_OFFSET = PDOMNamedNode.RECORD_SIZE + 4;
|
||||||
|
@ -133,6 +100,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode {
|
||||||
if (binding != null) {
|
if (binding != null) {
|
||||||
if (visitor.visit(binding))
|
if (visitor.visit(binding))
|
||||||
binding.accept(visitor);
|
binding.accept(visitor);
|
||||||
|
visitor.leave(binding);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
@ -172,6 +140,4 @@ public abstract class PDOMLinkage extends PDOMNamedNode {
|
||||||
|
|
||||||
public abstract IBinding resolveBinding(IASTName name) throws CoreException;
|
public abstract IBinding resolveBinding(IASTName name) throws CoreException;
|
||||||
|
|
||||||
public abstract void findBindings(Pattern pattern, List bindings) throws CoreException;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,7 @@ public abstract class PDOMMemberOwner extends PDOMBinding {
|
||||||
PDOMNode node = linkage.getNode(item.getItem());
|
PDOMNode node = linkage.getNode(item.getItem());
|
||||||
if (visitor.visit(node))
|
if (visitor.visit(node))
|
||||||
node.accept(visitor);
|
node.accept(visitor);
|
||||||
|
visitor.leave(node);
|
||||||
item = item.getNext();
|
item = item.getNext();
|
||||||
} while (!item.equals(firstItem));
|
} while (!item.equals(firstItem));
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.dom.c;
|
package org.eclipse.cdt.internal.core.pdom.dom.c;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
|
||||||
|
@ -202,6 +199,8 @@ public class PDOMCLinkage extends PDOMLinkage {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public PDOMBinding getBinding() { return binding; }
|
public PDOMBinding getBinding() { return binding; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,11 +294,6 @@ public class PDOMCLinkage extends PDOMLinkage {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void findBindings(Pattern pattern, List bindings) throws CoreException {
|
|
||||||
MatchBinding visitor = new MatchBinding(pdom, pattern, bindings);
|
|
||||||
getIndex().accept(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
|
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -63,6 +63,8 @@ public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType {
|
||||||
fields.add(node);
|
fields.add(node);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public IField[] getFields() {
|
public IField[] getFields() {
|
||||||
return (IField[])fields.toArray(new IField[fields.size()]);
|
return (IField[])fields.toArray(new IField[fields.size()]);
|
||||||
}
|
}
|
||||||
|
@ -94,6 +96,8 @@ public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public IField getField() { return field; }
|
public IField getField() { return field; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,8 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
|
||||||
methods.add(node);
|
methods.add(node);
|
||||||
return false; // don't visit the method
|
return false; // don't visit the method
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public ICPPMethod[] getMethods() {
|
public ICPPMethod[] getMethods() {
|
||||||
return (ICPPMethod[])methods.toArray(new ICPPMethod[methods.size()]);
|
return (ICPPMethod[])methods.toArray(new ICPPMethod[methods.size()]);
|
||||||
}
|
}
|
||||||
|
@ -200,6 +202,8 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
|
||||||
fields.add(node);
|
fields.add(node);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public IField[] getFields() {
|
public IField[] getFields() {
|
||||||
return (IField[])fields.toArray(new IField[fields.size()]);
|
return (IField[])fields.toArray(new IField[fields.size()]);
|
||||||
}
|
}
|
||||||
|
@ -227,6 +231,8 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
|
||||||
nestedClasses.add(node);
|
nestedClasses.add(node);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public ICPPClassType[] getNestedClasses() {
|
public ICPPClassType[] getNestedClasses() {
|
||||||
return (ICPPClassType[])nestedClasses.toArray(new ICPPClassType[nestedClasses.size()]);
|
return (ICPPClassType[])nestedClasses.toArray(new ICPPClassType[nestedClasses.size()]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
import org.eclipse.cdt.core.dom.IPDOMNode;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
||||||
|
@ -247,6 +244,8 @@ public class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
public PDOMBinding getBinding() { return binding; }
|
public PDOMBinding getBinding() { return binding; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -394,11 +393,6 @@ public class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void findBindings(Pattern pattern, List bindings) throws CoreException {
|
|
||||||
MatchBinding visitor = new MatchBinding(pdom, pattern, bindings);
|
|
||||||
getIndex().accept(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
|
public PDOMNode addType(PDOMNode parent, IType type) throws CoreException {
|
||||||
if (type instanceof ICPPBasicType)
|
if (type instanceof ICPPBasicType)
|
||||||
return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType)type);
|
return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType)type);
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
import org.eclipse.cdt.internal.core.pdom.db.BTree;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.FindBindingsInBTree;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
|
@ -75,6 +76,7 @@ public class PDOMCPPNamespace extends PDOMBinding
|
||||||
if (binding != null) {
|
if (binding != null) {
|
||||||
if (visitor.visit(binding))
|
if (visitor.visit(binding))
|
||||||
binding.accept(visitor);
|
binding.accept(visitor);
|
||||||
|
visitor.leave(binding);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
@ -123,43 +125,20 @@ public class PDOMCPPNamespace extends PDOMBinding
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBinding[] find(String name) throws DOMException {
|
public IBinding[] find(String name) throws DOMException {
|
||||||
throw new PDOMNotImplementedError();
|
try {
|
||||||
|
FindBindingsInBTree visitor = new FindBindingsInBTree(pdom, name.toCharArray());
|
||||||
|
getIndex().accept(visitor);
|
||||||
|
return visitor.getBinding();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
return new IBinding[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void flushCache() throws DOMException {
|
public void flushCache() throws DOMException {
|
||||||
throw new PDOMNotImplementedError();
|
throw new PDOMNotImplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class FindBinding extends PDOMNamedNode.NodeFinder {
|
|
||||||
PDOMBinding pdomBinding;
|
|
||||||
final int[] desiredType;
|
|
||||||
public FindBinding(PDOM pdom, char[] name, int desiredType) {
|
|
||||||
this(pdom, name, new int[] { desiredType });
|
|
||||||
}
|
|
||||||
public FindBinding(PDOM pdom, char[] name, int[] desiredType) {
|
|
||||||
super(pdom, name);
|
|
||||||
this.desiredType = desiredType;
|
|
||||||
}
|
|
||||||
public boolean visit(int record) throws CoreException {
|
|
||||||
if (record == 0)
|
|
||||||
return true;
|
|
||||||
PDOMBinding tBinding = pdom.getBinding(record);
|
|
||||||
if (!tBinding.hasName(name))
|
|
||||||
// no more bindings with our desired name
|
|
||||||
return false;
|
|
||||||
int nodeType = tBinding.getNodeType();
|
|
||||||
for (int i = 0; i < desiredType.length; ++i)
|
|
||||||
if (nodeType == desiredType[i]) {
|
|
||||||
// got it
|
|
||||||
pdomBinding = tBinding;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrong type, try again
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
|
public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
|
||||||
try {
|
try {
|
||||||
if (name instanceof ICPPASTQualifiedName) {
|
if (name instanceof ICPPASTQualifiedName) {
|
||||||
|
@ -182,7 +161,7 @@ public class PDOMCPPNamespace extends PDOMBinding
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// Look up the name
|
// Look up the name
|
||||||
FindBinding visitor = new FindBinding(pdom, name.toCharArray(),
|
FindBindingsInBTree visitor = new FindBindingsInBTree(pdom, name.toCharArray(),
|
||||||
new int[] {
|
new int[] {
|
||||||
PDOMCPPLinkage.CPPCLASSTYPE,
|
PDOMCPPLinkage.CPPCLASSTYPE,
|
||||||
PDOMCPPLinkage.CPPNAMESPACE,
|
PDOMCPPLinkage.CPPNAMESPACE,
|
||||||
|
@ -190,28 +169,32 @@ public class PDOMCPPNamespace extends PDOMBinding
|
||||||
PDOMCPPLinkage.CPPVARIABLE
|
PDOMCPPLinkage.CPPVARIABLE
|
||||||
});
|
});
|
||||||
getIndex().accept(visitor);
|
getIndex().accept(visitor);
|
||||||
return visitor.pdomBinding;
|
IBinding[] bindings = visitor.getBinding();
|
||||||
|
return bindings.length > 0 ? bindings[0] : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (parent instanceof IASTIdExpression) {
|
if (parent instanceof IASTIdExpression) {
|
||||||
// reference
|
// reference
|
||||||
IASTNode eParent = parent.getParent();
|
IASTNode eParent = parent.getParent();
|
||||||
if (eParent instanceof IASTFunctionCallExpression) {
|
if (eParent instanceof IASTFunctionCallExpression) {
|
||||||
FindBinding visitor = new FindBinding(pdom, name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION);
|
FindBindingsInBTree visitor = new FindBindingsInBTree(pdom, name.toCharArray(), PDOMCPPLinkage.CPPFUNCTION);
|
||||||
getIndex().accept(visitor);
|
getIndex().accept(visitor);
|
||||||
return visitor.pdomBinding;
|
IBinding[] bindings = visitor.getBinding();
|
||||||
|
return bindings.length > 0 ? bindings[0] : null;
|
||||||
} else {
|
} else {
|
||||||
FindBinding visitor = new FindBinding(pdom, name.toCharArray(),
|
FindBindingsInBTree visitor = new FindBindingsInBTree(pdom, name.toCharArray(),
|
||||||
(name.getParent() instanceof ICPPASTQualifiedName
|
(name.getParent() instanceof ICPPASTQualifiedName
|
||||||
&& ((ICPPASTQualifiedName)name.getParent()).getLastName() != name)
|
&& ((ICPPASTQualifiedName)name.getParent()).getLastName() != name)
|
||||||
? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE);
|
? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE);
|
||||||
getIndex().accept(visitor);
|
getIndex().accept(visitor);
|
||||||
return visitor.pdomBinding;
|
IBinding[] bindings = visitor.getBinding();
|
||||||
|
return bindings.length > 0 ? bindings[0] : null;
|
||||||
}
|
}
|
||||||
} else if (parent instanceof IASTNamedTypeSpecifier) {
|
} else if (parent instanceof IASTNamedTypeSpecifier) {
|
||||||
FindBinding visitor = new FindBinding(pdom, name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE);
|
FindBindingsInBTree visitor = new FindBindingsInBTree(pdom, name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE);
|
||||||
getIndex().accept(visitor);
|
getIndex().accept(visitor);
|
||||||
return visitor.pdomBinding;
|
IBinding[] bindings = visitor.getBinding();
|
||||||
|
return bindings.length > 0 ? bindings[0] : null;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMVisitor;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CtagsBindingFinder implements IPDOMVisitor {
|
|
||||||
|
|
||||||
private final String name;
|
|
||||||
private final int[] types;
|
|
||||||
private List bindings = new ArrayList();
|
|
||||||
|
|
||||||
public CtagsBindingFinder(String name, int[] types) {
|
|
||||||
this.name = name;
|
|
||||||
this.types = types;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean visit(IPDOMNode node) throws CoreException {
|
|
||||||
PDOMBinding binding = (PDOMBinding)node;
|
|
||||||
if (name.equals(binding.getDBName())) {
|
|
||||||
int type = binding.getNodeType();
|
|
||||||
for (int i = 0; i < types.length; ++i) {
|
|
||||||
if (type == types[i]) {
|
|
||||||
bindings.add(binding);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PDOMBinding[] getBindings() {
|
|
||||||
return (PDOMBinding[])bindings.toArray(new PDOMBinding[bindings.size()]);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,245 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
|
||||||
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.cdt.internal.core.pdom.dom.PDOMNode;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCFunction;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkage;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCVariable;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CtagsCName implements IASTName, IASTFileLocation {
|
|
||||||
|
|
||||||
private final PDOMLinkage linkage;
|
|
||||||
private final String fileName;
|
|
||||||
private final int lineNum;
|
|
||||||
private final String elementName;
|
|
||||||
private final Map fields;
|
|
||||||
private PDOMBinding binding;
|
|
||||||
private int kind; // Enum from below
|
|
||||||
|
|
||||||
private final static int K_UNKNOWN = 0;
|
|
||||||
private final static int K_CLASS = 1;
|
|
||||||
private final static int K_MACRO = 2;
|
|
||||||
private final static int K_ENUMERATOR = 3;
|
|
||||||
private final static int K_FUNCTION = 4;
|
|
||||||
private final static int K_ENUM = 5;
|
|
||||||
private final static int K_MEMBER = 6;
|
|
||||||
private final static int K_NAMESPACE = 7;
|
|
||||||
private final static int K_PROTOTYPE = 8;
|
|
||||||
private final static int K_STRUCT = 9;
|
|
||||||
private final static int K_TYPEDEF = 10;
|
|
||||||
private final static int K_UNION = 11;
|
|
||||||
private final static int K_VARIABLE = 12;
|
|
||||||
private final static int K_EXTERNALVAR = 13;
|
|
||||||
|
|
||||||
private final static String[] kinds = { // Order must match value of enum above
|
|
||||||
null, // unknown kinds
|
|
||||||
"class", //$NON-NLS-1$
|
|
||||||
"macro", //$NON-NLS-1$
|
|
||||||
"enumerator", //$NON-NLS-1$
|
|
||||||
"function", //$NON-NLS-1$
|
|
||||||
"enum", //$NON-NLS-1$
|
|
||||||
"member", //$NON-NLS-1$
|
|
||||||
"namespace", //$NON-NLS-1$
|
|
||||||
"prototype", //$NON-NLS-1$
|
|
||||||
"struct", //$NON-NLS-1$
|
|
||||||
"typedef", //$NON-NLS-1$
|
|
||||||
"union", //$NON-NLS-1$
|
|
||||||
"variable", //$NON-NLS-1$
|
|
||||||
"externvar", //$NON-NLS-1$
|
|
||||||
};
|
|
||||||
|
|
||||||
public CtagsCName(PDOMLinkage linkage, String fileName, int lineNum, String elementName, Map fields) throws CoreException {
|
|
||||||
this.linkage = linkage;
|
|
||||||
this.fileName = fileName;
|
|
||||||
this.lineNum = lineNum;
|
|
||||||
this.elementName = elementName;
|
|
||||||
this.fields = fields;
|
|
||||||
|
|
||||||
kind = K_UNKNOWN;
|
|
||||||
String kindField = (String)fields.get("kind"); //$NON-NLS-1$
|
|
||||||
if (kindField != null) {
|
|
||||||
for (int i = 1; i < kinds.length; ++i) {
|
|
||||||
if (kindField.equals(kinds[i])) {
|
|
||||||
kind = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addToPDOM(PDOMFile file) throws CoreException {
|
|
||||||
linkage.addName(this, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding getBinding() {
|
|
||||||
return binding;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDeclaration() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDefinition() {
|
|
||||||
// TODO base on kind
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isReference() {
|
|
||||||
// We're never a reference
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PDOMBinding makeNewBinding(IPDOMNode scope) throws CoreException {
|
|
||||||
switch (kind) {
|
|
||||||
case K_VARIABLE:
|
|
||||||
return new PDOMCVariable(linkage.getPDOM(), (PDOMNode)scope, this);
|
|
||||||
case K_FUNCTION:
|
|
||||||
return new PDOMCFunction(linkage.getPDOM(), (PDOMNode)scope, this);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding resolveBinding() {
|
|
||||||
try {
|
|
||||||
IPDOMNode scope = linkage;
|
|
||||||
int[] types = null;
|
|
||||||
switch (kind) {
|
|
||||||
case K_VARIABLE:
|
|
||||||
types = new int[] { PDOMCLinkage.CVARIABLE };
|
|
||||||
break;
|
|
||||||
case K_FUNCTION:
|
|
||||||
types = new int[] { PDOMCLinkage.CFUNCTION };
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
CtagsBindingFinder finder = new CtagsBindingFinder(elementName, types);
|
|
||||||
scope.accept(finder);
|
|
||||||
PDOMBinding[] bindings = finder.getBindings();
|
|
||||||
if (bindings.length == 0)
|
|
||||||
binding = makeNewBinding(scope);
|
|
||||||
else if (bindings.length == 1)
|
|
||||||
binding = bindings[0];
|
|
||||||
else
|
|
||||||
// TODO resolve overloads
|
|
||||||
binding = bindings[0];
|
|
||||||
return binding;
|
|
||||||
} catch (CoreException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding[] resolvePrefix() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBinding(IBinding binding) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public char[] toCharArray() {
|
|
||||||
return elementName.toCharArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean accept(ASTVisitor visitor) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContainingFilename() {
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTFileLocation getFileLocation() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTNodeLocation[] getNodeLocations() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTNode getParent() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ASTNodeProperty getPropertyInParent() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRawSignature() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTTranslationUnit getTranslationUnit() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParent(IASTNode node) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPropertyInParent(ASTNodeProperty property) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEndingLineNumber() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFileName() {
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStartingLineNumber() {
|
|
||||||
return lineNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTFileLocation asFileLocation() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNodeLength() {
|
|
||||||
// -1 means we have a line num as the offset
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNodeOffset() {
|
|
||||||
// since node length is -1, we can return the line number here
|
|
||||||
return lineNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,245 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMNode;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
|
||||||
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.cdt.internal.core.pdom.dom.PDOMNode;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPFunction;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkage;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPVariable;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CtagsCPPName implements IASTName, IASTFileLocation {
|
|
||||||
|
|
||||||
private final PDOMLinkage linkage;
|
|
||||||
private final String fileName;
|
|
||||||
private final int lineNum;
|
|
||||||
private final String elementName;
|
|
||||||
private final Map fields;
|
|
||||||
private int kind; // Enum from below
|
|
||||||
|
|
||||||
private final static int K_UNKNOWN = 0;
|
|
||||||
private final static int K_CLASS = 1;
|
|
||||||
private final static int K_MACRO = 2;
|
|
||||||
private final static int K_ENUMERATOR = 3;
|
|
||||||
private final static int K_FUNCTION = 4;
|
|
||||||
private final static int K_ENUM = 5;
|
|
||||||
private final static int K_MEMBER = 6;
|
|
||||||
private final static int K_NAMESPACE = 7;
|
|
||||||
private final static int K_PROTOTYPE = 8;
|
|
||||||
private final static int K_STRUCT = 9;
|
|
||||||
private final static int K_TYPEDEF = 10;
|
|
||||||
private final static int K_UNION = 11;
|
|
||||||
private final static int K_VARIABLE = 12;
|
|
||||||
private final static int K_EXTERNALVAR = 13;
|
|
||||||
|
|
||||||
private PDOMBinding binding;
|
|
||||||
|
|
||||||
private final static String[] kinds = { // Order must match value of enum above
|
|
||||||
null, // unknown kinds
|
|
||||||
"class", //$NON-NLS-1$
|
|
||||||
"macro", //$NON-NLS-1$
|
|
||||||
"enumerator", //$NON-NLS-1$
|
|
||||||
"function", //$NON-NLS-1$
|
|
||||||
"enum", //$NON-NLS-1$
|
|
||||||
"member", //$NON-NLS-1$
|
|
||||||
"namespace", //$NON-NLS-1$
|
|
||||||
"prototype", //$NON-NLS-1$
|
|
||||||
"struct", //$NON-NLS-1$
|
|
||||||
"typedef", //$NON-NLS-1$
|
|
||||||
"union", //$NON-NLS-1$
|
|
||||||
"variable", //$NON-NLS-1$
|
|
||||||
"externvar", //$NON-NLS-1$
|
|
||||||
};
|
|
||||||
|
|
||||||
public CtagsCPPName(PDOMLinkage linkage, String fileName, int lineNum, String elementName, Map fields) throws CoreException {
|
|
||||||
this.linkage = linkage;
|
|
||||||
this.fileName = fileName;
|
|
||||||
this.lineNum = lineNum;
|
|
||||||
this.elementName = elementName;
|
|
||||||
this.fields = fields;
|
|
||||||
|
|
||||||
kind = K_UNKNOWN;
|
|
||||||
String kindField = (String)fields.get("kind"); //$NON-NLS-1$
|
|
||||||
if (kindField != null) {
|
|
||||||
for (int i = 1; i < kinds.length; ++i) {
|
|
||||||
if (kindField.equals(kinds[i])) {
|
|
||||||
kind = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addToPDOM(PDOMFile file) throws CoreException {
|
|
||||||
linkage.addName(this, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding getBinding() {
|
|
||||||
return binding;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDeclaration() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDefinition() {
|
|
||||||
// Find out how function definitions are done
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isReference() {
|
|
||||||
// We're never a reference
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PDOMBinding makeNewBinding(IPDOMNode scope) throws CoreException {
|
|
||||||
switch (kind) {
|
|
||||||
case K_VARIABLE:
|
|
||||||
return new PDOMCPPVariable(linkage.getPDOM(), (PDOMNode)scope, this);
|
|
||||||
case K_FUNCTION:
|
|
||||||
return new PDOMCPPFunction(linkage.getPDOM(), (PDOMNode)scope, this);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding resolveBinding() {
|
|
||||||
try {
|
|
||||||
IPDOMNode scope = linkage;
|
|
||||||
int[] types = null;
|
|
||||||
switch (kind) {
|
|
||||||
case K_VARIABLE:
|
|
||||||
types = new int[] { PDOMCPPLinkage.CPPVARIABLE };
|
|
||||||
break;
|
|
||||||
case K_FUNCTION:
|
|
||||||
types = new int[] { PDOMCPPLinkage.CPPFUNCTION };
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
CtagsBindingFinder finder = new CtagsBindingFinder(elementName, types);
|
|
||||||
scope.accept(finder);
|
|
||||||
PDOMBinding[] bindings = finder.getBindings();
|
|
||||||
if (bindings.length == 0)
|
|
||||||
binding = makeNewBinding(scope);
|
|
||||||
else if (bindings.length == 1)
|
|
||||||
binding = bindings[0];
|
|
||||||
else
|
|
||||||
// TODO resolve overloads
|
|
||||||
binding = bindings[0];
|
|
||||||
return binding;
|
|
||||||
} catch (CoreException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBinding[] resolvePrefix() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBinding(IBinding binding) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public char[] toCharArray() {
|
|
||||||
return elementName.toCharArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean accept(ASTVisitor visitor) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContainingFilename() {
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTFileLocation getFileLocation() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTNodeLocation[] getNodeLocations() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTNode getParent() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ASTNodeProperty getPropertyInParent() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRawSignature() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTTranslationUnit getTranslationUnit() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setParent(IASTNode node) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPropertyInParent(ASTNodeProperty property) {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEndingLineNumber() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFileName() {
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStartingLineNumber() {
|
|
||||||
return lineNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IASTFileLocation asFileLocation() {
|
|
||||||
throw new PDOMNotImplementedError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNodeLength() {
|
|
||||||
// -1 means we have a line num as the offset
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNodeOffset() {
|
|
||||||
// since node length is -1, we can return the line number here
|
|
||||||
return lineNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,163 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Platform;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CtagsHandleDelta extends CtagsIndexerJob {
|
|
||||||
|
|
||||||
private final ICElementDelta delta;
|
|
||||||
|
|
||||||
private List added = new ArrayList();
|
|
||||||
private List changed = new ArrayList();
|
|
||||||
private List removed = new ArrayList();
|
|
||||||
|
|
||||||
public CtagsHandleDelta(CtagsIndexer indexer, ICElementDelta delta) throws CoreException {
|
|
||||||
super(indexer);
|
|
||||||
this.delta = delta;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
|
||||||
try {
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
|
|
||||||
processDelta(delta);
|
|
||||||
|
|
||||||
int count = changed.size() + added.size() + removed.size();
|
|
||||||
|
|
||||||
if (count > 0) {
|
|
||||||
monitor.beginTask("Indexing", count);
|
|
||||||
|
|
||||||
Iterator i = changed.iterator();
|
|
||||||
while (i.hasNext()) {
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
|
||||||
monitor.subTask(tu.getElementName());
|
|
||||||
changeTU(tu);
|
|
||||||
monitor.worked(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = added.iterator();
|
|
||||||
while (i.hasNext()) {
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
|
||||||
monitor.subTask(tu.getElementName());
|
|
||||||
addTU(tu);
|
|
||||||
monitor.worked(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = removed.iterator();
|
|
||||||
while (i.hasNext()) {
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)i.next();
|
|
||||||
monitor.subTask(tu.getElementName());
|
|
||||||
removeTU(tu);
|
|
||||||
monitor.worked(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
|
|
||||||
+ "/debug/pdomtimings"); //$NON-NLS-1$
|
|
||||||
if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
|
|
||||||
System.out.println("PDOM Full Delta Time: " + (System.currentTimeMillis() - start)); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status.OK_STATUS;
|
|
||||||
} catch (CoreException e) {
|
|
||||||
return e.getStatus();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
return Status.CANCEL_STATUS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void processDelta(ICElementDelta delta) throws CoreException {
|
|
||||||
int flags = delta.getFlags();
|
|
||||||
|
|
||||||
if ((flags & ICElementDelta.F_CHILDREN) != 0) {
|
|
||||||
ICElementDelta[] children = delta.getAffectedChildren();
|
|
||||||
for (int i = 0; i < children.length; ++i) {
|
|
||||||
processDelta(children[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICElement element = delta.getElement();
|
|
||||||
switch (element.getElementType()) {
|
|
||||||
case ICElement.C_UNIT:
|
|
||||||
ITranslationUnit tu = (ITranslationUnit)element;
|
|
||||||
switch (delta.getKind()) {
|
|
||||||
case ICElementDelta.CHANGED:
|
|
||||||
if ((flags & ICElementDelta.F_CONTENT) != 0)
|
|
||||||
changed.add(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.ADDED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
added.add(tu);
|
|
||||||
break;
|
|
||||||
case ICElementDelta.REMOVED:
|
|
||||||
if (!tu.isWorkingCopy())
|
|
||||||
removed.add(tu);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void addTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
|
||||||
IPath path = ((IFile)tu.getResource()).getLocation();
|
|
||||||
runCtags(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
|
||||||
IPath path = ((IFile)tu.getResource()).getLocation();
|
|
||||||
pdom.acquireWriteLock();
|
|
||||||
try {
|
|
||||||
// Remove the old symbols in the tu
|
|
||||||
PDOMFile file = pdom.getFile(path);
|
|
||||||
if (file != null)
|
|
||||||
file.clear();
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
pdom.releaseWriteLock();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the new symbols
|
|
||||||
runCtags(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void removeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
|
|
||||||
pdom.acquireWriteLock();
|
|
||||||
try {
|
|
||||||
IPath path = ((IFile)tu.getResource()).getLocation();
|
|
||||||
PDOMFile file = pdom.getFile(path);
|
|
||||||
if (file != null)
|
|
||||||
file.clear();
|
|
||||||
} finally {
|
|
||||||
pdom.releaseWriteLock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,239 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.ICDescriptor;
|
|
||||||
import org.eclipse.cdt.core.ICExtensionReference;
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMIndexer;
|
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
|
||||||
import org.eclipse.core.resources.ProjectScope;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.Platform;
|
|
||||||
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
|
||||||
import org.eclipse.core.runtime.preferences.IPreferencesService;
|
|
||||||
import org.eclipse.core.runtime.preferences.InstanceScope;
|
|
||||||
import org.osgi.service.prefs.BackingStoreException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*/
|
|
||||||
public class CtagsIndexer implements IPDOMIndexer {
|
|
||||||
|
|
||||||
public static final String ID = "org.eclipse.cdt.core.ctagsindexer"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private ICProject project;
|
|
||||||
|
|
||||||
private boolean useCtagsOnPath = true;
|
|
||||||
private String ctagsCommand = ""; //$NON-NLS-1$
|
|
||||||
private boolean useInternalCtagsFile = true;
|
|
||||||
private String ctagsFileName = ""; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public void handleDelta(ICElementDelta delta) throws CoreException {
|
|
||||||
// Don't use me, I'm broken
|
|
||||||
CCorePlugin.getPDOMManager().setIndexerId(project, PDOMNullIndexer.ID);
|
|
||||||
// new CtagsHandleDelta(this,delta).schedule();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reindex() throws CoreException {
|
|
||||||
// Don't use me, I'm broken
|
|
||||||
CCorePlugin.getPDOMManager().setIndexerId(project, PDOMNullIndexer.ID);
|
|
||||||
// new CtagsReindex(this).schedule();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICProject getProject() {
|
|
||||||
return project;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProject(ICProject project) {
|
|
||||||
this.project = project;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Preference Management
|
|
||||||
private static final String useCtagsOnPathId = "useCtagsOnPath"; //$NON-NLS-1$
|
|
||||||
private static final String ctagsCommandId = "ctagsCommand"; //$NON-NLS-1$
|
|
||||||
private static final String useInternalCtagsFileId = "useInternalCtagsFile"; //$NON-NLS-$
|
|
||||||
private static final String ctagsFileNameId = "ctagsFileName"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
// project preferences
|
|
||||||
private void loadPreferences() {
|
|
||||||
IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
|
|
||||||
if (prefs == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ctagsCommand = prefs.get(ctagsCommandId, null);
|
|
||||||
if (ctagsCommand != null) {
|
|
||||||
useCtagsOnPath = prefs.getBoolean(useCtagsOnPathId, getDefaultUseCtagsOnPath());
|
|
||||||
useInternalCtagsFile = prefs.getBoolean(useInternalCtagsFileId, getDefaultUseInternalCtagsFile());
|
|
||||||
ctagsFileName = prefs.get(ctagsFileNameId, getDefaultCtagsFileName());
|
|
||||||
} else {
|
|
||||||
// Not defined yet check in cdescriptor
|
|
||||||
try {
|
|
||||||
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(project.getProject(), false);
|
|
||||||
if (desc != null) {
|
|
||||||
ICExtensionReference[] cext = desc.get(CCorePlugin.INDEXER_UNIQ_ID);
|
|
||||||
if (cext.length > 0) {
|
|
||||||
for (int i = 0; i < cext.length; i++) {
|
|
||||||
String orig = cext[i].getExtensionData("ctagslocationtype"); //$NON-NLS-1$
|
|
||||||
useCtagsOnPath = orig != null
|
|
||||||
? !orig.equals("ctags_path_specified")
|
|
||||||
: getDefaultUseCtagsOnPath();
|
|
||||||
|
|
||||||
orig = cext[i].getExtensionData("ctagslocation"); //$NON-NLS-1$
|
|
||||||
ctagsCommand = orig != null ? orig : getDefaultCtagsCommand();
|
|
||||||
|
|
||||||
orig = cext[i].getExtensionData("ctagfiletype"); //$NON-NLS-1$
|
|
||||||
useInternalCtagsFile = orig != null
|
|
||||||
? !orig.equals("ctags_external") //$NON-NLS-1$
|
|
||||||
: getDefaultUseInternalCtagsFile();
|
|
||||||
|
|
||||||
orig = cext[i].getExtensionData("ctagfilelocation"); //$NON-NLS-1$
|
|
||||||
ctagsFileName = orig != null ? orig : getDefaultCtagsFileName();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctagsCommand == null) {
|
|
||||||
useCtagsOnPath = getDefaultUseCtagsOnPath();
|
|
||||||
ctagsCommand = getDefaultCtagsCommand();
|
|
||||||
useInternalCtagsFile = getDefaultUseInternalCtagsFile();
|
|
||||||
ctagsFileName = getDefaultCtagsFileName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPreferences(
|
|
||||||
boolean useCtagsOnPath,
|
|
||||||
String ctagsCommand,
|
|
||||||
boolean useInternalCtagsFile,
|
|
||||||
String ctagsFileName) throws CoreException {
|
|
||||||
|
|
||||||
IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
|
|
||||||
if (prefs == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
boolean changed = false;
|
|
||||||
if (this.useCtagsOnPath != useCtagsOnPath) {
|
|
||||||
this.useCtagsOnPath = useCtagsOnPath;
|
|
||||||
prefs.putBoolean(useCtagsOnPathId, useCtagsOnPath);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! this.ctagsCommand.equals(ctagsCommand)) {
|
|
||||||
this.ctagsCommand = ctagsCommand;
|
|
||||||
prefs.put(ctagsCommandId, ctagsCommand);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.useInternalCtagsFile != useInternalCtagsFile) {
|
|
||||||
this.useInternalCtagsFile = useInternalCtagsFile;
|
|
||||||
prefs.putBoolean(useInternalCtagsFileId, useInternalCtagsFile);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! this.ctagsFileName.equals(ctagsFileName)) {
|
|
||||||
this.ctagsFileName = ctagsFileName;
|
|
||||||
prefs.put(ctagsFileNameId, ctagsFileName);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed) {
|
|
||||||
try {
|
|
||||||
prefs.flush();
|
|
||||||
} catch (BackingStoreException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
}
|
|
||||||
reindex();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean useCtagsOnPath() {
|
|
||||||
return useCtagsOnPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCtagsCommand() {
|
|
||||||
return ctagsCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getResolvedCtagsCommand() {
|
|
||||||
return useCtagsOnPath ? "ctags" : ctagsCommand; //$NON-NLS-1
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean useInternalCtagsFile() {
|
|
||||||
return useInternalCtagsFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCtagsFileName() {
|
|
||||||
return ctagsFileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getResolvedCtagsFileName() {
|
|
||||||
if (useInternalCtagsFile)
|
|
||||||
return CCorePlugin.getDefault().getStateLocation().append(project.getElementName() + ".ctags").toOSString(); //$NON-NLS-1$
|
|
||||||
else
|
|
||||||
return ctagsFileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defaults stored in metadata
|
|
||||||
public static boolean getDefaultUseCtagsOnPath() {
|
|
||||||
IPreferencesService prefService = Platform.getPreferencesService();
|
|
||||||
return prefService.getBoolean(CCorePlugin.PLUGIN_ID, useCtagsOnPathId,
|
|
||||||
true, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getDefaultCtagsCommand() {
|
|
||||||
IPreferencesService prefService = Platform.getPreferencesService();
|
|
||||||
return prefService.getString(CCorePlugin.PLUGIN_ID, ctagsCommandId,
|
|
||||||
"", null); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean getDefaultUseInternalCtagsFile() {
|
|
||||||
IPreferencesService prefService = Platform.getPreferencesService();
|
|
||||||
return prefService.getBoolean(CCorePlugin.PLUGIN_ID, useInternalCtagsFileId,
|
|
||||||
true, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getDefaultCtagsFileName() {
|
|
||||||
IPreferencesService prefService = Platform.getPreferencesService();
|
|
||||||
return prefService.getString(CCorePlugin.PLUGIN_ID, ctagsFileNameId,
|
|
||||||
"", null); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setDefaultPreferences(
|
|
||||||
boolean useCtagsOnPath,
|
|
||||||
String ctagsCommand,
|
|
||||||
boolean useInternalCtagsFile,
|
|
||||||
String ctagsFileName) {
|
|
||||||
|
|
||||||
IEclipsePreferences prefs = new InstanceScope().getNode(CCorePlugin.PLUGIN_ID);
|
|
||||||
if (prefs == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
prefs.putBoolean(useCtagsOnPathId, useCtagsOnPath);
|
|
||||||
prefs.put(ctagsCommandId, ctagsCommand);
|
|
||||||
prefs.putBoolean(useInternalCtagsFileId, useInternalCtagsFile);
|
|
||||||
prefs.put(ctagsFileNameId, ctagsFileName);
|
|
||||||
|
|
||||||
try {
|
|
||||||
prefs.flush();
|
|
||||||
} catch (BackingStoreException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,153 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.jobs.Job;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public abstract class CtagsIndexerJob extends Job {
|
|
||||||
|
|
||||||
protected final CtagsIndexer indexer;
|
|
||||||
protected final PDOM pdom;
|
|
||||||
|
|
||||||
public CtagsIndexerJob(CtagsIndexer indexer) throws CoreException {
|
|
||||||
super("ctags Indexer: " + indexer.getProject().getElementName());
|
|
||||||
this.indexer = indexer;
|
|
||||||
this.pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(indexer.getProject());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indexing functions
|
|
||||||
void runCtags(IPath sourcePath) {
|
|
||||||
String ctagsFileName = indexer.getResolvedCtagsFileName();
|
|
||||||
File ctagsFile = new File(ctagsFileName);
|
|
||||||
if (ctagsFile.exists())
|
|
||||||
ctagsFile.delete();
|
|
||||||
|
|
||||||
String[] cmd = new String[] {
|
|
||||||
indexer.getResolvedCtagsCommand(),
|
|
||||||
"--excmd=number", //$NON-NLS-1$
|
|
||||||
"--format=2", //$NON-NLS-1$
|
|
||||||
"--sort=no", //$NON-NLS-1$
|
|
||||||
"--fields=aiKlmnsSz", //$NON-NLS-1$
|
|
||||||
"--c-types=cdefgmnpstuvx", //$NON-NLS-1$
|
|
||||||
"--c++-types=cdefgmnpstuvx", //$NON-NLS-1$
|
|
||||||
"--languages=c,c++", //$NON-NLS-1$
|
|
||||||
"-f", //$NON-NLS-1$
|
|
||||||
ctagsFileName,
|
|
||||||
"-R", //$NON-NLS-2$
|
|
||||||
sourcePath.toOSString() // Give absolute path so that tag file entries will be absolute
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Run ctags
|
|
||||||
Process p = Runtime.getRuntime().exec(cmd);
|
|
||||||
p.waitFor();
|
|
||||||
|
|
||||||
// Parse the ctags file
|
|
||||||
pdom.acquireWriteLock();
|
|
||||||
try {
|
|
||||||
processCtagsFile(ctagsFileName);
|
|
||||||
} finally {
|
|
||||||
pdom.releaseWriteLock();
|
|
||||||
}
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
return;
|
|
||||||
} catch (IOException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
return;
|
|
||||||
} catch (CoreException e) {
|
|
||||||
CCorePlugin.log(e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processCtagsFile(String ctagsFileName) throws IOException, CoreException {
|
|
||||||
BufferedReader reader = new BufferedReader(new FileReader(ctagsFileName));
|
|
||||||
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
|
|
||||||
if (line.charAt(0) == '!')
|
|
||||||
// skip over header
|
|
||||||
continue;
|
|
||||||
|
|
||||||
String elementName = null;
|
|
||||||
String fileName = null;
|
|
||||||
int lineNum = -1;
|
|
||||||
Map fields = new HashMap();
|
|
||||||
|
|
||||||
StringTokenizer tokenizer = new StringTokenizer(line, "\t"); //$NON-NLS-1$
|
|
||||||
for (int state = 0; tokenizer.hasMoreTokens(); ++state) {
|
|
||||||
String token = tokenizer.nextToken();
|
|
||||||
switch (state) {
|
|
||||||
case 0:
|
|
||||||
// element name
|
|
||||||
elementName = token;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
// file name
|
|
||||||
fileName = token;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
// line number
|
|
||||||
try {
|
|
||||||
token = token.trim();
|
|
||||||
int i = token.indexOf(';');
|
|
||||||
lineNum = Integer.parseInt(token.substring(0, i)) - 1; // Make it 0 based
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Not sure what the line number is.
|
|
||||||
lineNum = -1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// extension field
|
|
||||||
int i = token.indexOf(':');
|
|
||||||
if (i != -1) {
|
|
||||||
String key = token.substring(0, i);
|
|
||||||
String value = token.substring(i + 1);
|
|
||||||
fields.put(key, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (elementName != null && fileName != null) {
|
|
||||||
PDOMFile file = pdom.addFile(fileName);
|
|
||||||
String languageName = (String)fields.get("language"); //$NON-NLS-1$
|
|
||||||
if (languageName.equals("C++")) { //$NON-NLS-1$
|
|
||||||
PDOMLinkage linkage = pdom.getLinkage(new GPPLanguage());
|
|
||||||
new CtagsCPPName(linkage, fileName, lineNum, elementName, fields).addToPDOM(file);
|
|
||||||
} else {
|
|
||||||
PDOMLinkage linkage = pdom.getLinkage(new GCCLanguage());
|
|
||||||
new CtagsCName(linkage, fileName, lineNum, elementName, fields).addToPDOM(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2006 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
|
||||||
import org.eclipse.cdt.core.model.ISourceRoot;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Doug Schaefer
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CtagsReindex extends CtagsIndexerJob {
|
|
||||||
|
|
||||||
public CtagsReindex(CtagsIndexer indexer) throws CoreException {
|
|
||||||
super(indexer);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
|
||||||
try {
|
|
||||||
// What do we need to index
|
|
||||||
final ICProject project = indexer.getProject();
|
|
||||||
// final IIncludeReference[] pincludes = project.getIncludeReferences();
|
|
||||||
// IIncludeReference[] includes = new IIncludeReference[pincludes.length];
|
|
||||||
// System.arraycopy(pincludes, 0, includes, 0, pincludes.length);
|
|
||||||
|
|
||||||
// Find common prefix paths
|
|
||||||
// for (int i = 0; i < includes.length; ++i) {
|
|
||||||
// if (includes[i] == null)
|
|
||||||
// continue;
|
|
||||||
// IPath pathi = includes[i].getPath();
|
|
||||||
// for (int j = i + 1; j < includes.length; ++j) {
|
|
||||||
// if (includes[j] == null)
|
|
||||||
// continue;
|
|
||||||
// IPath pathj = includes[j].getPath();
|
|
||||||
// if (pathi.isPrefixOf(pathj)) {
|
|
||||||
// includes[j] = null;
|
|
||||||
// } else if (pathj.isPrefixOf(pathi)) {
|
|
||||||
// includes[i] = null;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// includes = (IIncludeReference[])ArrayUtil.removeNulls(IIncludeReference.class, includes);
|
|
||||||
|
|
||||||
ISourceRoot[] sourceRoots = project.getAllSourceRoots();
|
|
||||||
|
|
||||||
monitor.beginTask("Indexing", sourceRoots.length + 1);
|
|
||||||
// + includes.length + 1);
|
|
||||||
|
|
||||||
// Clear out the PDOM
|
|
||||||
if (monitor.isCanceled())
|
|
||||||
return Status.CANCEL_STATUS;
|
|
||||||
monitor.subTask("Clearing Index");
|
|
||||||
pdom.clear();
|
|
||||||
monitor.worked(1);
|
|
||||||
|
|
||||||
// Index the include path
|
|
||||||
// for (int i = 0; i < includes.length; ++i) {
|
|
||||||
// if (monitor.isCanceled())
|
|
||||||
// return Status.CANCEL_STATUS;
|
|
||||||
// monitor.subTask(includes[i].getElementName());
|
|
||||||
// runCtags(includes[i].getPath());
|
|
||||||
// monitor.worked(1);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Index the source roots
|
|
||||||
for (int i = 0; i < sourceRoots.length; ++i) {
|
|
||||||
ISourceRoot sourceRoot = sourceRoots[i];
|
|
||||||
IPath sourcePath = sourceRoot.getResource().getLocation();
|
|
||||||
if (sourcePath != null) {
|
|
||||||
if (monitor.isCanceled())
|
|
||||||
return Status.CANCEL_STATUS;
|
|
||||||
monitor.subTask(sourceRoot.getElementName());
|
|
||||||
runCtags(sourcePath);
|
|
||||||
monitor.worked(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (CoreException e) {
|
|
||||||
return e.getStatus();
|
|
||||||
} finally {
|
|
||||||
monitor.done();
|
|
||||||
}
|
|
||||||
return Status.OK_STATUS;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -103,6 +103,8 @@ public class CountNodeAction extends IndexAction {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
|
|
|
@ -139,6 +139,8 @@ public class IndexView extends ViewPart implements PDOM.IListener, IElementChang
|
||||||
++count;
|
++count;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Children implements IPDOMVisitor {
|
private static class Children implements IPDOMVisitor {
|
||||||
|
@ -151,6 +153,8 @@ public class IndexView extends ViewPart implements PDOM.IListener, IElementChang
|
||||||
nodes[index++] = node;
|
nodes[index++] = node;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class HasChildren implements IPDOMVisitor {
|
private static class HasChildren implements IPDOMVisitor {
|
||||||
|
@ -159,6 +163,8 @@ public class IndexView extends ViewPart implements PDOM.IListener, IElementChang
|
||||||
hasChildren = true;
|
hasChildren = true;
|
||||||
throw new CoreException(Status.OK_STATUS);
|
throw new CoreException(Status.OK_STATUS);
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static PDOMBinding[] trim(PDOMBinding []binding) {
|
static PDOMBinding[] trim(PDOMBinding []binding) {
|
||||||
|
|
|
@ -146,3 +146,4 @@ PDOMSearch.query.refs.label = Find references to
|
||||||
PDOMSearch.query.defs.label = Find definitions of
|
PDOMSearch.query.defs.label = Find definitions of
|
||||||
PDOMSearch.query.decls.label = Find declarations of
|
PDOMSearch.query.decls.label = Find declarations of
|
||||||
PDOMSearchPatternQuery.PatternQuery_labelPatternInScope={0} {1} in {2}
|
PDOMSearchPatternQuery.PatternQuery_labelPatternInScope={0} {1} in {2}
|
||||||
|
PDOMSearch.query.pattern.error = Illegal Search String
|
||||||
|
|
|
@ -14,7 +14,6 @@ package org.eclipse.cdt.internal.ui.search;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
|
@ -159,31 +158,6 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage {
|
||||||
|
|
||||||
// get the pattern and turn it into a regular expression
|
// get the pattern and turn it into a regular expression
|
||||||
String patternStr = patternCombo.getText();
|
String patternStr = patternCombo.getText();
|
||||||
String realStr = patternStr;
|
|
||||||
if (realStr.indexOf('*') >= 0 || realStr.indexOf('?') >= 0) {
|
|
||||||
StringBuffer buff = new StringBuffer(patternStr.length() + 1);
|
|
||||||
for (int i = 0; i < patternStr.length(); ++i) {
|
|
||||||
char c = patternStr.charAt(i);
|
|
||||||
switch (c) {
|
|
||||||
case '*':
|
|
||||||
buff.append(".*"); //$NON-NLS-1$
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
buff.append('.');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
buff.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
realStr = buff.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
Pattern pattern;
|
|
||||||
try {
|
|
||||||
pattern = Pattern.compile(realStr);
|
|
||||||
} catch (PatternSyntaxException e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get search flags
|
// Get search flags
|
||||||
int searchFlags = 0;
|
int searchFlags = 0;
|
||||||
|
@ -250,12 +224,17 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage {
|
||||||
? null
|
? null
|
||||||
: (ICElement[])elements.toArray(new ICElement[elements.size()]);
|
: (ICElement[])elements.toArray(new ICElement[elements.size()]);
|
||||||
|
|
||||||
PDOMSearchPatternQuery job = new PDOMSearchPatternQuery(scope, scopeDescription, pattern, patternStr,
|
try {
|
||||||
|
PDOMSearchPatternQuery job = new PDOMSearchPatternQuery(scope, scopeDescription, patternStr,
|
||||||
isCaseSensitive, searchFlags);
|
isCaseSensitive, searchFlags);
|
||||||
|
|
||||||
NewSearchUI.activateSearchResultView();
|
NewSearchUI.activateSearchResultView();
|
||||||
|
|
||||||
NewSearchUI.runQueryInBackground(job);
|
NewSearchUI.runQueryInBackground(job);
|
||||||
|
} catch (PatternSyntaxException e) {
|
||||||
|
fLineManager.setErrorMessage(CSearchMessages.getString("PDOMSearch.query.pattern.error")); //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Save our settings
|
// Save our settings
|
||||||
IDialogSettings settings = getDialogSettings();
|
IDialogSettings settings = getDialogSettings();
|
||||||
|
@ -267,7 +246,7 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage {
|
||||||
// Add only if we don't have it already
|
// Add only if we don't have it already
|
||||||
boolean addit = true;
|
boolean addit = true;
|
||||||
for (int i = 0; i < previousPatterns.length; ++i) {
|
for (int i = 0; i < previousPatterns.length; ++i) {
|
||||||
if (pattern.equals(previousPatterns[i])) {
|
if (patternStr.equals(previousPatterns[i])) {
|
||||||
addit = false;
|
addit = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,10 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.ui.search;
|
package org.eclipse.cdt.internal.ui.search;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.dom.IPDOM;
|
import org.eclipse.cdt.core.dom.IPDOM;
|
||||||
|
@ -53,19 +56,48 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
|
||||||
|
|
||||||
private String scopeDesc;
|
private String scopeDesc;
|
||||||
private String patternStr;
|
private String patternStr;
|
||||||
private Pattern pattern;
|
private Pattern[] pattern;
|
||||||
|
|
||||||
public PDOMSearchPatternQuery(
|
public PDOMSearchPatternQuery(
|
||||||
ICElement[] scope,
|
ICElement[] scope,
|
||||||
String scopeDesc,
|
String scopeDesc,
|
||||||
Pattern pattern,
|
|
||||||
String patternStr,
|
String patternStr,
|
||||||
boolean isCaseSensitive,
|
boolean isCaseSensitive,
|
||||||
int flags) {
|
int flags) throws PatternSyntaxException {
|
||||||
super(scope, flags);
|
super(scope, flags);
|
||||||
this.scopeDesc = scopeDesc;
|
this.scopeDesc = scopeDesc;
|
||||||
this.pattern = pattern;
|
|
||||||
this.patternStr = patternStr;
|
this.patternStr = patternStr;
|
||||||
|
|
||||||
|
// Parse the pattern string
|
||||||
|
List patternList = new ArrayList();
|
||||||
|
StringBuffer buff = new StringBuffer();
|
||||||
|
int n = patternStr.length();
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
char c = patternStr.charAt(i);
|
||||||
|
switch (c) {
|
||||||
|
case '*':
|
||||||
|
buff.append(".*"); //$NON-NLS-1$
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
buff.append('.');
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
case ':':
|
||||||
|
if (buff.length() > 0) {
|
||||||
|
patternList.add(Pattern.compile(buff.toString()));
|
||||||
|
buff = new StringBuffer();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buff.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buff.length() > 0)
|
||||||
|
patternList.add(Pattern.compile(buff.toString()));
|
||||||
|
|
||||||
|
pattern = (Pattern[])patternList.toArray(new Pattern[patternList.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
|
public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
|
||||||
|
|
|
@ -78,6 +78,8 @@ public class PDOMCompletionContributor extends DOMCompletionContributor implemen
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else if (parent instanceof IASTFieldReference) {
|
} else if (parent instanceof IASTFieldReference) {
|
||||||
// Find the type the look at the fields
|
// Find the type the look at the fields
|
||||||
|
@ -98,6 +100,8 @@ public class PDOMCompletionContributor extends DOMCompletionContributor implemen
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
public void leave(IPDOMNode node) throws CoreException {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,250 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2005, 2006 IBM Corporation and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* IBM - Initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
package org.eclipse.cdt.ui.dialogs;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.dom.IPDOMIndexer;
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.ctags.CtagsIndexer;
|
|
||||||
import org.eclipse.cdt.internal.ui.CUIMessages;
|
|
||||||
import org.eclipse.cdt.internal.ui.util.SWTUtil;
|
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
|
||||||
import org.eclipse.cdt.ui.index.AbstractIndexerPage;
|
|
||||||
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.IStatus;
|
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
|
||||||
import org.eclipse.core.runtime.Status;
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.events.SelectionAdapter;
|
|
||||||
import org.eclipse.swt.events.SelectionEvent;
|
|
||||||
import org.eclipse.swt.events.SelectionListener;
|
|
||||||
import org.eclipse.swt.layout.GridData;
|
|
||||||
import org.eclipse.swt.widgets.Button;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.FileDialog;
|
|
||||||
import org.eclipse.swt.widgets.Group;
|
|
||||||
import org.eclipse.swt.widgets.Text;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Bogdan Gheorghe
|
|
||||||
*/
|
|
||||||
public class CTagsIndexerBlock extends AbstractIndexerPage {
|
|
||||||
|
|
||||||
protected CtagsIndexer ctagsIndexer;
|
|
||||||
|
|
||||||
protected boolean internalTagsFile = true;
|
|
||||||
protected Button internalCTagsFile;
|
|
||||||
protected Button externalCTagsFile;
|
|
||||||
protected Button browseButton;
|
|
||||||
protected Text cTagsFile;
|
|
||||||
|
|
||||||
protected boolean useDefaultCTags = true;
|
|
||||||
protected Button useCTagsPath;
|
|
||||||
protected Button useCTagsExecutable;
|
|
||||||
protected Button browseButtonCTagsExec;
|
|
||||||
protected Text cTagsExecutable;
|
|
||||||
|
|
||||||
public final static String PREF_INTOREXT_CTAGS = CUIPlugin.PLUGIN_ID + ".intorextctags"; //$NON-NLS-1$
|
|
||||||
public final static String PREF_CTAGS_FILE_LOCATION_CTAGS = CUIPlugin.PLUGIN_ID + ".ctagsfilelocation"; //$NON-NLS-1$
|
|
||||||
public final static String PREF_CTAGS_INDEXINCLUDEFILES = CUIPlugin.PLUGIN_ID + ".ctagsindexincludes"; //$NON-NLS-1$
|
|
||||||
public final static String PREF_CTAGS_LOCATION_TYPE = CUIPlugin.PLUGIN_ID + ".ctagslocationtype"; //$NON-NLS-1$
|
|
||||||
public final static String PREF_CTAGS_LOCATION = CUIPlugin.PLUGIN_ID + ".ctagslocation"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
public void initialize(ICProject project) {
|
|
||||||
this.currentProject = project;
|
|
||||||
try {
|
|
||||||
loadPersistedValues(project);
|
|
||||||
} catch (CoreException e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void performApply(IProgressMonitor monitor) throws CoreException {
|
|
||||||
if (monitor == null) {
|
|
||||||
monitor = new NullProgressMonitor();
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor.beginTask(CUIMessages.getString("IndexerOptiosn.task.savingAttributes "), 1); //$NON-NLS-1$
|
|
||||||
if (ctagsIndexer != null) {
|
|
||||||
ctagsIndexer.setPreferences(
|
|
||||||
useDefaultCTags,
|
|
||||||
cTagsExecutable.getText(),
|
|
||||||
internalTagsFile,
|
|
||||||
cTagsFile.getText());
|
|
||||||
} else {
|
|
||||||
CtagsIndexer.setDefaultPreferences(
|
|
||||||
useDefaultCTags,
|
|
||||||
cTagsExecutable.getText(),
|
|
||||||
internalTagsFile,
|
|
||||||
cTagsFile.getText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void performDefaults() {
|
|
||||||
//ctag file options
|
|
||||||
internalTagsFile=true;
|
|
||||||
internalCTagsFile.setSelection(true);
|
|
||||||
externalCTagsFile.setSelection(false);
|
|
||||||
cTagsFile.setText(""); //$NON-NLS-1$
|
|
||||||
browseButton.setEnabled(false);
|
|
||||||
//ctag path options
|
|
||||||
useDefaultCTags=true;
|
|
||||||
useCTagsPath.setSelection(true);
|
|
||||||
useCTagsExecutable.setSelection(false);
|
|
||||||
cTagsExecutable.setText(""); //$NON-NLS-1$
|
|
||||||
browseButtonCTagsExec.setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void createControl(Composite parent) {
|
|
||||||
Composite page = ControlFactory.createComposite(parent, 1);
|
|
||||||
|
|
||||||
Group cTagsExecutableGroup = ControlFactory.createGroup(page,CUIMessages.getString("CTagsIndexerBlock.ctagsLocation"),3); //$NON-NLS-1$
|
|
||||||
GridData gd3 = (GridData) cTagsExecutableGroup.getLayoutData();
|
|
||||||
gd3.grabExcessHorizontalSpace = true;
|
|
||||||
gd3.horizontalAlignment = GridData.FILL;
|
|
||||||
|
|
||||||
SelectionListener cTagsListener = new SelectionAdapter() {
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
useDefaultCTags = useCTagsPath.getSelection();
|
|
||||||
if (useDefaultCTags){
|
|
||||||
setCommandState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useCTagsPath = ControlFactory.createRadioButton(cTagsExecutableGroup,CUIMessages.getString("CTagsIndexerBlock.radioButtonCTagsDefault"),"CTagsDefault",cTagsListener);//$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
((GridData)useCTagsPath.getLayoutData()).horizontalSpan = 3;
|
|
||||||
((GridData)useCTagsPath.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
useCTagsPath.setSelection(internalTagsFile);
|
|
||||||
|
|
||||||
useCTagsExecutable = ControlFactory.createRadioButton(cTagsExecutableGroup,CUIMessages.getString("CTagsIndexerBlock.radioButtonCTagsSpecified"),"CTafsSpecified",cTagsListener);//$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
((GridData)useCTagsExecutable.getLayoutData()).horizontalSpan = 3;
|
|
||||||
((GridData)useCTagsExecutable.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
|
|
||||||
cTagsExecutable = ControlFactory.createTextField(cTagsExecutableGroup);
|
|
||||||
((GridData)cTagsExecutable.getLayoutData()).horizontalSpan = 2;
|
|
||||||
((GridData)cTagsExecutable.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
|
|
||||||
browseButtonCTagsExec = ControlFactory.createPushButton(cTagsExecutableGroup,CUIMessages.getString("CTagsIndexerBlock.browseButton")); //$NON-NLS-1$
|
|
||||||
((GridData)browseButtonCTagsExec.getLayoutData()).widthHint = SWTUtil.getButtonWidthHint(browseButtonCTagsExec);
|
|
||||||
browseButtonCTagsExec.setEnabled(false);
|
|
||||||
browseButtonCTagsExec.addSelectionListener(new SelectionAdapter() {
|
|
||||||
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
handleBrowseButtonSelected();
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleBrowseButtonSelected() {
|
|
||||||
cTagsExecutable.setText(openFileBrowser());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//
|
|
||||||
|
|
||||||
Group group = ControlFactory.createGroup(page, CUIMessages.getString("CTagsIndexerBlock.blockName"),3); //$NON-NLS-1$
|
|
||||||
|
|
||||||
GridData gd = (GridData) group.getLayoutData();
|
|
||||||
gd.grabExcessHorizontalSpace = true;
|
|
||||||
gd.horizontalAlignment = GridData.FILL;
|
|
||||||
|
|
||||||
|
|
||||||
SelectionListener cListener = new SelectionAdapter() {
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
internalTagsFile = internalCTagsFile.getSelection();
|
|
||||||
if (internalTagsFile){
|
|
||||||
setFilenameState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
internalCTagsFile = ControlFactory.createRadioButton(group,CUIMessages.getString("CTagsIndexerBlock.radioButtonInternal"),"Internal",cListener);//$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
((GridData)internalCTagsFile.getLayoutData()).horizontalSpan = 3;
|
|
||||||
((GridData)internalCTagsFile.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
internalCTagsFile.setSelection(internalTagsFile);
|
|
||||||
|
|
||||||
externalCTagsFile = ControlFactory.createRadioButton(group,CUIMessages.getString("CTagsIndexerBlock.radioButtonExternal"),"External",cListener);//$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
((GridData)externalCTagsFile.getLayoutData()).horizontalSpan = 3;
|
|
||||||
((GridData)externalCTagsFile.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
|
|
||||||
cTagsFile = ControlFactory.createTextField(group);
|
|
||||||
((GridData)cTagsFile.getLayoutData()).horizontalSpan = 2;
|
|
||||||
((GridData)cTagsFile.getLayoutData()).grabExcessHorizontalSpace = true;
|
|
||||||
|
|
||||||
browseButton = ControlFactory.createPushButton(group,CUIMessages.getString("CTagsIndexerBlock.browseButton")); //$NON-NLS-1$
|
|
||||||
((GridData)browseButton.getLayoutData()).widthHint = SWTUtil.getButtonWidthHint(browseButton);
|
|
||||||
browseButton.setEnabled(false);
|
|
||||||
browseButton.addSelectionListener(new SelectionAdapter() {
|
|
||||||
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
handleBrowseButtonSelected();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleBrowseButtonSelected() {
|
|
||||||
cTagsFile.setText(openFileBrowser());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setControl(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
String openFileBrowser(){
|
|
||||||
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
|
|
||||||
dialog.setText(CUIMessages.getString("CTagsIndexerBlock.fileBrowser")); //$NON-NLS-1$
|
|
||||||
String fileName = dialog.open();
|
|
||||||
if (fileName == null) {
|
|
||||||
return ""; //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadPersistedValues(ICProject project) throws CoreException {
|
|
||||||
IPDOMIndexer indexer = CCorePlugin.getPDOMManager().getIndexer(project);
|
|
||||||
if (!(indexer instanceof CtagsIndexer))
|
|
||||||
throw new CoreException(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, "Wrong indexer", null)); //$NON-NLS-1$
|
|
||||||
ctagsIndexer = (CtagsIndexer)indexer;
|
|
||||||
|
|
||||||
useDefaultCTags = ctagsIndexer.useCtagsOnPath();
|
|
||||||
cTagsExecutable.setText(ctagsIndexer.getCtagsCommand());
|
|
||||||
setCommandState();
|
|
||||||
|
|
||||||
internalTagsFile = ctagsIndexer.useInternalCtagsFile();
|
|
||||||
cTagsFile.setText(ctagsIndexer.getCtagsFileName());
|
|
||||||
setFilenameState();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCommandState() {
|
|
||||||
useCTagsPath.setSelection(useDefaultCTags);
|
|
||||||
useCTagsExecutable.setSelection(!useDefaultCTags);
|
|
||||||
browseButtonCTagsExec.setEnabled(!useDefaultCTags);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setFilenameState() {
|
|
||||||
internalCTagsFile.setSelection(internalTagsFile);
|
|
||||||
externalCTagsFile.setSelection(!internalTagsFile);
|
|
||||||
browseButton.setEnabled(!internalTagsFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadPreferences() {
|
|
||||||
useDefaultCTags = CtagsIndexer.getDefaultUseCtagsOnPath();
|
|
||||||
cTagsExecutable.setText(CtagsIndexer.getDefaultCtagsCommand());
|
|
||||||
setCommandState();
|
|
||||||
|
|
||||||
internalTagsFile = CtagsIndexer.getDefaultUseInternalCtagsFile();
|
|
||||||
cTagsFile.setText(CtagsIndexer.getDefaultCtagsFileName());
|
|
||||||
setFilenameState();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removePreferences() {
|
|
||||||
prefStore.setToDefault(PREF_CTAGS_FILE_LOCATION_CTAGS);
|
|
||||||
prefStore.setToDefault(PREF_INTOREXT_CTAGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue