diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java index adefdc0f43b..75f464c7259 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/OpenCallHierarchyAction.java @@ -17,6 +17,8 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IEnumeration; +import org.eclipse.cdt.core.model.IEnumerator; import org.eclipse.cdt.core.model.IFunctionDeclaration; import org.eclipse.cdt.core.model.IVariableDeclaration; import org.eclipse.cdt.ui.actions.SelectionDispatchAction; @@ -74,8 +76,16 @@ public class OpenCallHierarchyAction extends SelectionDispatchAction { } private boolean isValidElement(ICElement elem) { - return elem instanceof IFunctionDeclaration || - elem instanceof IVariableDeclaration; + if (elem instanceof IFunctionDeclaration) { + return true; + } + if (elem instanceof IVariableDeclaration) { + return !(elem instanceof IEnumeration); + } + if (elem instanceof IEnumerator) { + return true; + } + return false; } private Object getAdapter(Object object, Class desiredClass) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java index 9cadae1352f..5334e3f381f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java @@ -26,6 +26,7 @@ import org.eclipse.jface.text.Region; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IPositionConverter; +import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -38,7 +39,6 @@ import org.eclipse.cdt.core.model.IParent; import org.eclipse.cdt.core.model.ISourceRange; import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.core.model.IVariableDeclaration; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -278,12 +278,11 @@ public class CIndexQueries { if (pc != null) { offset= pc.historicToActual(new Region(offset, 0)).getOffset(); } - return findElement(tu, offset, false); + return findEnclosingFunction(tu, offset); } - private ICElement findElement(ICElement element, int offset, boolean allowVars) { - if (element == null || (element instanceof IFunctionDeclaration) || - (allowVars && element instanceof IVariableDeclaration)) { + private ICElement findEnclosingFunction(ICElement element, int offset) { + if (element == null || (element instanceof IFunctionDeclaration)) { return element; } try { @@ -295,7 +294,7 @@ public class CIndexQueries { ISourceRange sr= ((ISourceReference) child).getSourceRange(); int startPos= sr.getStartPos(); if (startPos <= offset && offset < startPos + sr.getLength()) { - return findElement(child, offset, allowVars); + return findEnclosingFunction(child, offset); } } } @@ -305,7 +304,41 @@ public class CIndexQueries { } return null; } - + + private ICElement findCElementForDeclaration(ICElement element, int offset, int length) { + int endoffset= offset+length; + if (element == null) { + return null; + } + try { + if (element instanceof IParent) { + ICElement[] children= ((IParent) element).getChildren(); + for (int i = 0; i < children.length; i++) { + ICElement child = children[i]; + if (child instanceof ISourceReference) { + ISourceRange sr= ((ISourceReference) child).getSourceRange(); + int offset2= sr.getIdStartPos(); + int endoffset2= offset2+sr.getIdLength(); + if (offset <= offset2 && endoffset2 <= endoffset) { + return child; + } + offset2= sr.getStartPos(); + endoffset2= offset2+sr.getLength(); + if (offset2 <= offset && endoffset <= endoffset2) { + ICElement result= findCElementForDeclaration(child, offset, length); + if (result != null) { + return result; + } + } + } + } + } + } catch (CModelException e) { + CUIPlugin.getDefault().log(e); + } + return null; + } + private ITranslationUnit toTranslationUnit(ICProject cproject, IASTName name) { IPath path= Path.fromOSString(name.getFileLocation().getFileName()); try { @@ -393,7 +426,7 @@ public class CIndexQueries { ArrayList result= new ArrayList(defs.length); for (int i = 0; i < defs.length; i++) { IASTName defName = defs[i]; - ICElement elem= findEnclosingElement(project, defName); + ICElement elem= findCElementForDeclaration(project, defName); if (elem != null) { result.add(elem); } @@ -403,25 +436,26 @@ public class CIndexQueries { return EMPTY_ELEMENTS; } - private ICElement findEnclosingElement(ICProject project, IASTName declName) { + private ICElement findCElementForDeclaration(ICProject project, IASTName declName) { ITranslationUnit tu= toTranslationUnit(project, declName); if (tu != null) { - int offset= 0; + IRegion region= null; if (declName instanceof PDOMName) { PDOMName pname= (PDOMName) declName; - offset= pname.getNodeOffset(); + region= new Region(pname.getNodeOffset(), pname.getNodeLength()); // mstodo use correct timestamp // PDOMFile file= pname.getFile(); long timestamp= tu.getPath().toFile().lastModified(); IPositionConverter pc= CCorePlugin.getPositionTrackerManager().findPositionConverter(tu.getPath(), timestamp); if (pc != null) { - offset= pc.historicToActual(new Region(offset, 0)).getOffset(); + region= pc.historicToActual(region); } } else { - offset= declName.getFileLocation().getNodeOffset(); + IASTFileLocation loc= declName.getFileLocation(); + region= new Region(loc.getNodeOffset(), loc.getNodeLength()); } - return findElement(tu, offset, true); + return findCElementForDeclaration(tu, region.getOffset(), region.getLength()); } return null; } @@ -441,7 +475,7 @@ public class CIndexQueries { public ICElement findDefinition(ICProject project, IASTName name) { if (name.isDefinition()) { - return findEnclosingElement(project, name); + return findCElementForDeclaration(project, name); } PDOM pdom; @@ -474,7 +508,7 @@ public class CIndexQueries { if (defs != null) { for (int i = 0; i < defs.length; i++) { IASTName defName = defs[i]; - ICElement elem= findEnclosingElement(project, defName); + ICElement elem= findCElementForDeclaration(project, defName); if (elem != null) { return elem; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/ReferenceVisitor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/ReferenceVisitor.java index 5635708a4d0..82bcbd73a8a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/ReferenceVisitor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/ReferenceVisitor.java @@ -57,12 +57,14 @@ class ReferenceVisitor extends ASTVisitor { public int visit(IASTDeclaration declaration) { IASTFileLocation loc= declaration.getFileLocation(); - if (!loc.getFileName().equals(fFileName)) { - return PROCESS_SKIP; - } - int offset= loc.getNodeOffset(); - if (offset + loc.getNodeLength() <= fOffset || fEndOffset <= offset) { - return PROCESS_SKIP; + if (loc != null) { + if (!loc.getFileName().equals(fFileName)) { + return PROCESS_SKIP; + } + int offset= loc.getNodeOffset(); + if (offset + loc.getNodeLength() <= fOffset || fEndOffset <= offset) { + return PROCESS_SKIP; + } } return PROCESS_CONTINUE; } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/FindNameForSelectionVisitor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/FindNameForSelectionVisitor.java index f76f83fcd6b..037b86fe83d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/FindNameForSelectionVisitor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/FindNameForSelectionVisitor.java @@ -66,6 +66,10 @@ public class FindNameForSelectionVisitor extends ASTVisitor { public int visit(IASTName name) { IASTFileLocation loc= name.getFileLocation(); + if (loc == null) { + return PROCESS_CONTINUE; + } + if (!loc.getFileName().equals(fFilePath)) { return PROCESS_SKIP; }