1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Fix for 180815: defining multiple globals variables at structure definition causes dublicate struct tag entries in outline view

This commit is contained in:
Anton Leherbauer 2007-04-06 09:09:00 +00:00
parent 39e2a19ab7
commit dd4ecbc909
2 changed files with 42 additions and 34 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2005 QNX Software Systems and others. * Copyright (c) 2000, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -13,7 +13,7 @@ package org.eclipse.cdt.core.model;
/** /**
* Represents a field declared in a type. * Represents a field declared in a type.
*/ */
public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference, IParent { public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference {
/** /**
* Returns the type of the typedef item * Returns the type of the typedef item
* @return String * @return String

View file

@ -318,9 +318,13 @@ public class CModelBuilder2 implements IContributedModelBuilder {
Collections.sort(children, new Comparator() { Collections.sort(children, new Comparator() {
public int compare(Object o1, Object o2) { public int compare(Object o1, Object o2) {
try { try {
final SourceManipulation element1= (SourceManipulation)o1; final SourceManipulationInfo info1= ((SourceManipulation)o1).getSourceManipulationInfo();
final SourceManipulation element2= (SourceManipulation)o2; final SourceManipulationInfo info2= ((SourceManipulation)o2).getSourceManipulationInfo();
return element1.getSourceManipulationInfo().getStartPos() - element2.getSourceManipulationInfo().getStartPos(); int delta= info1.getStartPos() - info2.getStartPos();
if (delta == 0) {
delta= info1.getIdStartPos() - info2.getIdStartPos();
}
return delta;
} catch (CModelException exc) { } catch (CModelException exc) {
return 0; return 0;
} }
@ -509,20 +513,36 @@ public class CModelBuilder2 implements IContributedModelBuilder {
final IASTDeclSpecifier declSpecifier= declaration.getDeclSpecifier(); final IASTDeclSpecifier declSpecifier= declaration.getDeclSpecifier();
final IASTDeclarator[] declarators= declaration.getDeclarators(); final IASTDeclarator[] declarators= declaration.getDeclarators();
final CElement[] elements; final CElement[] elements;
if (declarators.length > 0) { boolean isCompositeType= declSpecifier instanceof IASTCompositeTypeSpecifier || declSpecifier instanceof IASTEnumerationSpecifier;
if (declarators.length == 0) {
elements= new CElement[1];
final CElement element= createSimpleDeclaration(parent, declSpecifier, null, isTemplate);
elements[0]= element;
} else if (declarators.length == 1 && isCompositeType) {
elements= new CElement[declarators.length];
final IASTDeclarator declarator= declarators[0];
CElement element= createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
if (element instanceof IParent) {
parent= (Parent)element;
if (!isTemplate) {
setBodyPosition((SourceManipulation)element, declSpecifier.getParent());
}
}
elements[0]= element;
createSimpleDeclaration(parent, declSpecifier, null, isTemplate);
} else {
if (isCompositeType) {
createSimpleDeclaration(parent, declSpecifier, null, isTemplate);
}
elements= new CElement[declarators.length]; elements= new CElement[declarators.length];
for (int i= 0; i < declarators.length; i++) { for (int i= 0; i < declarators.length; i++) {
final IASTDeclarator declarator= declarators[i]; final IASTDeclarator declarator= declarators[i];
final CElement element= createSimpleDeclaration(parent, declSpecifier, declarator, isTemplate); final CElement element= createSimpleDeclaration(parent, declSpecifier, declarator, isTemplate);
if (!isTemplate && element instanceof SourceManipulation && declarators.length > 1) { if (!isTemplate && element instanceof SourceManipulation) {
setBodyPosition((SourceManipulation)element, declarator); setBodyPosition((SourceManipulation)element, declarator);
} }
elements[i]= element; elements[i]= element;
} }
} else {
elements= new CElement[1];
final CElement element= createSimpleDeclaration(parent, declSpecifier, null, isTemplate);
elements[0]= element;
} }
return elements; return elements;
} }
@ -530,34 +550,22 @@ public class CModelBuilder2 implements IContributedModelBuilder {
private CElement createSimpleDeclaration(Parent parent, IASTDeclSpecifier declSpecifier, IASTDeclarator declarator, boolean isTemplate) throws CModelException, DOMException { private CElement createSimpleDeclaration(Parent parent, IASTDeclSpecifier declSpecifier, IASTDeclarator declarator, boolean isTemplate) throws CModelException, DOMException {
if (declSpecifier instanceof IASTCompositeTypeSpecifier) { if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
if (declarator != null) { if (declarator != null) {
// create type nested
CElement element= createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
if (element instanceof IParent) {
parent= (Parent)element;
if (!isTemplate) {
setBodyPosition((SourceManipulation)element, declSpecifier.getParent());
}
}
}
return createCompositeType(parent, (IASTCompositeTypeSpecifier)declSpecifier, isTemplate);
} else if (declSpecifier instanceof IASTElaboratedTypeSpecifier) {
if (declarator == null) {
return createElaboratedTypeDeclaration(parent, (IASTElaboratedTypeSpecifier)declSpecifier, isTemplate);
} else {
return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate); return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
} else {
return createCompositeType(parent, (IASTCompositeTypeSpecifier)declSpecifier, isTemplate);
}
} else if (declSpecifier instanceof IASTElaboratedTypeSpecifier) {
if (declarator != null) {
return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
} else {
return createElaboratedTypeDeclaration(parent, (IASTElaboratedTypeSpecifier)declSpecifier, isTemplate);
} }
} else if (declSpecifier instanceof IASTEnumerationSpecifier) { } else if (declSpecifier instanceof IASTEnumerationSpecifier) {
if (declarator != null) { if (declarator != null) {
// create type nested return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
CElement element= createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate); } else {
if (element instanceof IParent) {
parent= (Parent)element;
if (!isTemplate) {
setBodyPosition((SourceManipulation)element, declSpecifier.getParent());
}
}
}
return createEnumeration(parent, (IASTEnumerationSpecifier)declSpecifier); return createEnumeration(parent, (IASTEnumerationSpecifier)declSpecifier);
}
} else if (declSpecifier instanceof IASTNamedTypeSpecifier) { } else if (declSpecifier instanceof IASTNamedTypeSpecifier) {
return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate); return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
} else if (declSpecifier instanceof IASTSimpleDeclSpecifier) { } else if (declSpecifier instanceof IASTSimpleDeclSpecifier) {