mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 13:25:45 +02:00
Fix for Bug 88421 - outline view should display more information for: variables, classes and functions
This commit is contained in:
parent
11719658ed
commit
b786f3c0e9
6 changed files with 126 additions and 15 deletions
|
@ -393,7 +393,15 @@ public class CModelElementsTests extends TestCase {
|
|||
fail("field visibility should be public!");
|
||||
|
||||
// struct no name
|
||||
IStructure struct2 = (IStructure) nsStructs.get(1);
|
||||
IStructure struct2;
|
||||
if (IParent.class.isAssignableFrom(ITypeDef.class)) {
|
||||
// nested in typedef decl
|
||||
List nsTypeDefs = namespace.getChildrenOfType(ICElement.C_TYPEDEF);
|
||||
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
|
||||
struct2 = (IStructure) td2.getChildren()[0];
|
||||
} else {
|
||||
struct2 = (IStructure) nsStructs.get(1);
|
||||
}
|
||||
assertEquals(struct2.getElementName(), new String (""));
|
||||
checkElementOffset(struct2);
|
||||
checkLineNumbers(struct2, 101, 103);
|
||||
|
|
|
@ -398,7 +398,15 @@ public class StructuralCModelElementsTests extends TestCase {
|
|||
fail("field visibility should be public!"); //$NON-NLS-1$
|
||||
|
||||
// struct no name
|
||||
IStructure struct2 = (IStructure) nsStructs.get(1);
|
||||
IStructure struct2;
|
||||
if (IParent.class.isAssignableFrom(ITypeDef.class)) {
|
||||
// nested in typedef decl
|
||||
List nsTypeDefs = namespace.getChildrenOfType(ICElement.C_TYPEDEF);
|
||||
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
|
||||
struct2 = (IStructure) td2.getChildren()[0];
|
||||
} else {
|
||||
struct2 = (IStructure) nsStructs.get(1);
|
||||
}
|
||||
assertEquals(struct2.getElementName(), new String ("")); //$NON-NLS-1$
|
||||
checkElementOffset(struct2);
|
||||
checkLineNumbers(struct2, 101, 103);
|
||||
|
|
|
@ -13,7 +13,7 @@ package org.eclipse.cdt.core.model;
|
|||
/**
|
||||
* Represents a field declared in a type.
|
||||
*/
|
||||
public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference {
|
||||
public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference, IParent {
|
||||
/**
|
||||
* Returns the type of the typedef item
|
||||
* @return String
|
||||
|
|
|
@ -485,7 +485,8 @@ public class ASTStringUtil {
|
|||
// break;
|
||||
// }
|
||||
if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
|
||||
final int key= ((IASTCompositeTypeSpecifier)declSpecifier).getKey();
|
||||
final IASTCompositeTypeSpecifier compositeTypeSpec= (IASTCompositeTypeSpecifier)declSpecifier;
|
||||
final int key= compositeTypeSpec.getKey();
|
||||
switch (key) {
|
||||
case IASTCompositeTypeSpecifier.k_struct:
|
||||
buffer.append(Keywords.STRUCT).append(' ');
|
||||
|
@ -498,6 +499,7 @@ public class ASTStringUtil {
|
|||
break;
|
||||
default:
|
||||
}
|
||||
appendQualifiedNameString(buffer, compositeTypeSpec.getName());
|
||||
} else if (declSpecifier instanceof IASTElaboratedTypeSpecifier) {
|
||||
final IASTElaboratedTypeSpecifier elaboratedTypeSpec= (IASTElaboratedTypeSpecifier)declSpecifier;
|
||||
switch (elaboratedTypeSpec.getKind()) {
|
||||
|
|
|
@ -69,6 +69,7 @@ import org.eclipse.cdt.core.index.IIndex;
|
|||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.IContributedModelBuilder;
|
||||
import org.eclipse.cdt.core.model.IParent;
|
||||
import org.eclipse.cdt.core.model.IProblemRequestor;
|
||||
import org.eclipse.cdt.core.model.IStructure;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
|
@ -515,7 +516,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
for (int i= 0; i < declarators.length; i++) {
|
||||
final IASTDeclarator declarator= declarators[i];
|
||||
final CElement element= createSimpleDeclaration(parent, declSpecifier, declarator, isTemplate);
|
||||
if (!isTemplate && element instanceof SourceManipulation && i > 0) {
|
||||
if (!isTemplate && element instanceof SourceManipulation && declarators.length > 1) {
|
||||
setBodyPosition((SourceManipulation)element, declarator);
|
||||
}
|
||||
elements[i]= element;
|
||||
|
@ -530,10 +531,17 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
|
||||
private CElement createSimpleDeclaration(Parent parent, IASTDeclSpecifier declSpecifier, IASTDeclarator declarator, boolean isTemplate) throws CModelException, DOMException {
|
||||
if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
|
||||
final CElement compositeType= createCompositeType(parent, (IASTCompositeTypeSpecifier)declSpecifier, isTemplate);
|
||||
if (declarator != null) {
|
||||
return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
|
||||
// create type nested
|
||||
CElement element= createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
|
||||
if (element instanceof IParent) {
|
||||
parent= (Parent)element;
|
||||
if (!isTemplate) {
|
||||
setBodyPosition((SourceManipulation)element, declSpecifier.getParent());
|
||||
}
|
||||
}
|
||||
}
|
||||
final CElement compositeType= createCompositeType(parent, (IASTCompositeTypeSpecifier)declSpecifier, isTemplate);
|
||||
return compositeType;
|
||||
} else if (declSpecifier instanceof IASTElaboratedTypeSpecifier) {
|
||||
if (declarator == null) {
|
||||
|
@ -816,8 +824,11 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
} else {
|
||||
setIdentifierPosition(element, declSpecifier);
|
||||
}
|
||||
setBodyPosition(element, declSpecifier.getParent());
|
||||
|
||||
if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
|
||||
setBodyPosition(element, astTypedefName);
|
||||
} else {
|
||||
setBodyPosition(element, declSpecifier.getParent());
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
|
@ -874,7 +885,11 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
// set positions
|
||||
setIdentifierPosition(element, astVariableName);
|
||||
if (!isTemplate) {
|
||||
setBodyPosition(element, specifier.getParent());
|
||||
if (specifier instanceof IASTCompositeTypeSpecifier) {
|
||||
setBodyPosition(element, astVariableName);
|
||||
} else {
|
||||
setBodyPosition(element, specifier.getParent());
|
||||
}
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
|
|
@ -25,11 +25,14 @@ import org.eclipse.cdt.core.model.ICContainer;
|
|||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.IField;
|
||||
import org.eclipse.cdt.core.model.IFunctionDeclaration;
|
||||
import org.eclipse.cdt.core.model.IInheritance;
|
||||
import org.eclipse.cdt.core.model.IMethodDeclaration;
|
||||
import org.eclipse.cdt.core.model.ISourceRoot;
|
||||
import org.eclipse.cdt.core.model.ITemplate;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.core.model.ITypeDef;
|
||||
import org.eclipse.cdt.core.model.IVariableDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
|
||||
import org.eclipse.cdt.internal.corext.util.CModelUtil;
|
||||
|
@ -115,10 +118,10 @@ public class CElementLabels {
|
|||
public final static int T_FULLY_QUALIFIED= 1 << 13;
|
||||
|
||||
/**
|
||||
* Type names are post qualified.
|
||||
* e.g. <code>InnerClass - OuterClass</code>
|
||||
* Append base class specifications to type names.
|
||||
* e.g. <code>MyClass : public BaseClass</code>
|
||||
*/
|
||||
public final static int T_POST_QUALIFIED= 1 << 15;
|
||||
public final static int T_INHERITANCE= 1 << 16;
|
||||
|
||||
/**
|
||||
* Translation unit names contain the full path.
|
||||
|
@ -178,7 +181,7 @@ public class CElementLabels {
|
|||
/**
|
||||
* Post qualify all elements
|
||||
*/
|
||||
public final static int ALL_POST_QUALIFIED= F_POST_QUALIFIED | M_POST_QUALIFIED | T_POST_QUALIFIED | TU_POST_QUALIFIED | ROOT_POST_QUALIFIED;
|
||||
public final static int ALL_POST_QUALIFIED= F_POST_QUALIFIED | M_POST_QUALIFIED | TU_POST_QUALIFIED | ROOT_POST_QUALIFIED;
|
||||
|
||||
/**
|
||||
* Default options (M_PARAMETER_TYPES enabled)
|
||||
|
@ -193,7 +196,7 @@ public class CElementLabels {
|
|||
/**
|
||||
* Default post qualify options (All except Root)
|
||||
*/
|
||||
public final static int DEFAULT_POST_QUALIFIED= F_POST_QUALIFIED | M_POST_QUALIFIED | T_POST_QUALIFIED | TU_POST_QUALIFIED;
|
||||
public final static int DEFAULT_POST_QUALIFIED= F_POST_QUALIFIED | M_POST_QUALIFIED | TU_POST_QUALIFIED;
|
||||
|
||||
|
||||
public final static String CONCAT_STRING= CUIMessages.getString("CElementLabels.concat_string"); // " - "; //$NON-NLS-1$
|
||||
|
@ -260,6 +263,9 @@ public class CElementLabels {
|
|||
case ICElement.C_TEMPLATE_UNION_DECLARATION:
|
||||
getTypeLabel( element, flags, buf );
|
||||
break;
|
||||
case ICElement.C_TYPEDEF:
|
||||
getTypeDefLabel((ITypeDef)element, flags, buf);
|
||||
break;
|
||||
case ICElement.C_UNIT:
|
||||
getTranslationUnitLabel((ITranslationUnit) element, flags, buf);
|
||||
break;
|
||||
|
@ -548,6 +554,46 @@ public class CElementLabels {
|
|||
}
|
||||
}
|
||||
|
||||
public static void getTypeDefLabel(ITypeDef typedef, int flags, StringBuffer buf ) {
|
||||
// type
|
||||
if( getFlag( flags, F_PRE_TYPE_SIGNATURE ) && typedef.exists()) {
|
||||
buf.append( typedef.getTypeName() );
|
||||
buf.append( ' ' );
|
||||
}
|
||||
|
||||
//qualification
|
||||
if( getFlag( flags, F_FULLY_QUALIFIED ) ){
|
||||
ICElement parent = typedef.getParent();
|
||||
if (parent != null && parent.exists() && parent.getElementType() == ICElement.C_NAMESPACE) {
|
||||
getTypeLabel( parent, T_FULLY_QUALIFIED, buf );
|
||||
buf.append( "::" ); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
buf.append( typedef.getElementName() );
|
||||
|
||||
if( getFlag( flags, F_APP_TYPE_SIGNATURE ) && typedef.exists()) {
|
||||
buf.append( DECL_STRING );
|
||||
buf.append( typedef.getTypeName() );
|
||||
}
|
||||
|
||||
// post qualification
|
||||
if( getFlag(flags, F_POST_QUALIFIED)) {
|
||||
ICElement parent = typedef.getParent();
|
||||
if (parent != null && parent.exists() && parent.getElementType() == ICElement.C_NAMESPACE) {
|
||||
buf.append( CONCAT_STRING );
|
||||
getTypeLabel( typedef.getParent(), T_FULLY_QUALIFIED, buf );
|
||||
}
|
||||
}
|
||||
if( getFlag(flags, MF_POST_FILE_QUALIFIED)) {
|
||||
IPath path= typedef.getPath();
|
||||
if (path != null) {
|
||||
buf.append( CONCAT_STRING );
|
||||
buf.append(path.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the label for a source root to a StringBuffer. Considers the ROOT_* flags.
|
||||
*/
|
||||
|
@ -645,12 +691,44 @@ public class CElementLabels {
|
|||
}
|
||||
buf.append(typeName);
|
||||
|
||||
if (/*getFlag(flags, T_INHERITANCE) && */elem instanceof IInheritance) {
|
||||
IInheritance inheritance= (IInheritance)elem;
|
||||
String[] superclassNames= inheritance.getSuperClassesNames();
|
||||
if (superclassNames != null && superclassNames.length > 0) {
|
||||
buf.append(DECL_STRING);
|
||||
for (int i = 0; i < superclassNames.length; i++) {
|
||||
if (i> 0) {
|
||||
buf.append(COMMA_STRING);
|
||||
}
|
||||
String superclass = superclassNames[i];
|
||||
String visibility = getVisibility(inheritance.getSuperClassAccess(superclass));
|
||||
buf.append(visibility).append(' ').append(superclass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//template parameters
|
||||
if (elem instanceof ITemplate) {
|
||||
getTemplateParameters((ITemplate)elem, flags, buf);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an <code>ASTAccessVisibility</code> into its string representation.
|
||||
*
|
||||
* @param access
|
||||
* @return "public", "protected" or "private"
|
||||
*/
|
||||
private static String getVisibility(ASTAccessVisibility access) {
|
||||
if (access == ASTAccessVisibility.PUBLIC) {
|
||||
return "public"; //$NON-NLS-1$
|
||||
}
|
||||
if (access == ASTAccessVisibility.PROTECTED) {
|
||||
return "protected"; //$NON-NLS-1$
|
||||
}
|
||||
return "private"; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
private static boolean getFlag(int flags, int flag) {
|
||||
return (flags & flag) != 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue