From b16d7061a227f28277c445262252efa478a72a75 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Mon, 21 Jun 2004 18:48:03 +0000 Subject: [PATCH] - fix for bug #66108 (C++ browser cannot show members of class) - TypeParser now uses resource to get scanner info --- .../browser/ChangeLog-browser | 5 ++++ .../eclipse/cdt/core/browser/ITypeInfo.java | 5 ++++ .../cdt/core/browser/ITypeReference.java | 5 ++-- .../eclipse/cdt/core/browser/TypeInfo.java | 26 ++++++++++++++++++- .../cdt/core/browser/TypeReference.java | 4 +-- .../core/browser/cache/TypeParser.java | 10 +++---- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.core/browser/ChangeLog-browser b/core/org.eclipse.cdt.core/browser/ChangeLog-browser index d51cb9248c5..1de7722a7a9 100644 --- a/core/org.eclipse.cdt.core/browser/ChangeLog-browser +++ b/core/org.eclipse.cdt.core/browser/ChangeLog-browser @@ -1,3 +1,8 @@ +2004-06-21 Chris Wiebe + + - fix for bug #66108 (C++ browser cannot show members of class) + - TypeParser now uses resource to get scanner info + 2004-06-17 Alain Magloire Changes from Chris Wiebe to deal diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java index 62100aea57c..64e4159d68e 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeInfo.java @@ -145,6 +145,11 @@ public interface ITypeInfo extends Comparable { */ public ITypeReference getResolvedReference(); + /** + * Returns the corresponding CElement or null if not found. + */ + public ICElement getCElement(); + /** * Returns true if the type can be substituted. */ diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java index 8a547e59082..5b38e15ef8f 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/ITypeReference.java @@ -59,9 +59,10 @@ public interface ITypeReference { public int getLength(); /** - * Returns the CElement located at the stored offset and length. + * Returns the CElements located at the stored offset and length, + * or null if not found. */ - public ICElement getCElement(); + public ICElement[] getCElements(); /** * Returns a translation unit for this location. diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java index 8c7808bfcb5..6cc969397b1 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeInfo.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.core.browser; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ITypeDef; import org.eclipse.cdt.internal.core.browser.cache.ITypeCache; import org.eclipse.cdt.internal.core.browser.util.ArrayUtil; import org.eclipse.core.resources.IProject; @@ -24,7 +25,7 @@ public class TypeInfo implements ITypeInfo protected int fSourceRefsCount = 0; protected final static int INITIAL_REFS_SIZE = 1; - protected final static int REFS_GROW_BY = 10; + protected final static int REFS_GROW_BY = 2; protected final static ITypeInfo[] EMPTY_TYPES = new ITypeInfo[0]; public TypeInfo(int elementType, IQualifiedTypeName typeName) { @@ -53,6 +54,29 @@ public class TypeInfo implements ITypeInfo } return null; } + + public ICElement getCElement() { + ITypeReference ref = getResolvedReference(); + if (ref != null) { + ICElement[] elems = ref.getCElements(); + if (elems.length > 1) { + for (int i = 0; i < elems.length; ++i) { + ICElement elem = elems[i]; + if (elem.getElementType() == fElementType && elem.getElementName().equals(getName())) { + //TODO should check fully qualified name + return elem; + } + if (elem instanceof ITypeDef && ((ITypeDef)elem).getTypeName().equals(getName())) { + //TODO should check fully qualified name + return elem; + } + } + } else if (elems.length == 1) { + return elems[0]; + } + } + return null; + } public ITypeReference getResolvedReference() { for (int i = 0; i < fSourceRefsCount; ++i) { diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java index c5c46ebc8c6..0cfeb9a574b 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/TypeReference.java @@ -173,11 +173,11 @@ public class TypeReference implements ITypeReference { return null; } - public ICElement getCElement() { + public ICElement[] getCElements() { ITranslationUnit unit = getTranslationUnit(); if (unit != null) { try { - return unit.getElementAtOffset(fOffset); + return unit.getElementsAtOffset(fOffset); } catch (CModelException e) { } } diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java index 5585acd3488..1c754116144 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java @@ -284,15 +284,15 @@ public class TypeParser implements ISourceElementRequestor { CodeReader reader = null; Object stackObject = null; + IResource resource = null; if (workingCopy != null) { reader = createWorkingCopyReader(workingCopy); - IResource resource = workingCopy.getResource(); + resource = workingCopy.getResource(); if (resource != null) { path = resource.getLocation(); } stackObject = workingCopy; } else { - IResource resource = null; IWorkspace workspace = CCorePlugin.getWorkspace(); if (workspace != null) { IWorkspaceRoot wsRoot = workspace.getRoot(); @@ -314,7 +314,7 @@ public class TypeParser implements ISourceElementRequestor { fResourceStack.clear(); fScopeStack.clear(); fResourceStack.push(stackObject); - parseContents(path, project, reader, language, progressMonitor); + parseContents(path, resource, project, reader, language, progressMonitor); fResourceStack.pop(); } } finally { @@ -393,7 +393,7 @@ public class TypeParser implements ISourceElementRequestor { return reader; } - private void parseContents(IPath realPath, IProject project, CodeReader reader, ParserLanguage language, IProgressMonitor progressMonitor) throws InterruptedException { + private void parseContents(IPath realPath, IResource resource, IProject project, CodeReader reader, ParserLanguage language, IProgressMonitor progressMonitor) throws InterruptedException { IScannerInfo scanInfo = null; if (project != null) { @@ -401,7 +401,7 @@ public class TypeParser implements ISourceElementRequestor { try { IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project); if (provider != null) { - IScannerInfo buildScanInfo = provider.getScannerInformation(project); + IScannerInfo buildScanInfo = provider.getScannerInformation(resource != null ? resource : project); if (buildScanInfo != null) scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths()); }