mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-22 08:25:25 +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:
parent
39e2a19ab7
commit
dd4ecbc909
2 changed files with 42 additions and 34 deletions
|
@ -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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* 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.
|
||||
*/
|
||||
public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference, IParent {
|
||||
public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference {
|
||||
/**
|
||||
* Returns the type of the typedef item
|
||||
* @return String
|
||||
|
|
|
@ -318,9 +318,13 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
Collections.sort(children, new Comparator() {
|
||||
public int compare(Object o1, Object o2) {
|
||||
try {
|
||||
final SourceManipulation element1= (SourceManipulation)o1;
|
||||
final SourceManipulation element2= (SourceManipulation)o2;
|
||||
return element1.getSourceManipulationInfo().getStartPos() - element2.getSourceManipulationInfo().getStartPos();
|
||||
final SourceManipulationInfo info1= ((SourceManipulation)o1).getSourceManipulationInfo();
|
||||
final SourceManipulationInfo info2= ((SourceManipulation)o2).getSourceManipulationInfo();
|
||||
int delta= info1.getStartPos() - info2.getStartPos();
|
||||
if (delta == 0) {
|
||||
delta= info1.getIdStartPos() - info2.getIdStartPos();
|
||||
}
|
||||
return delta;
|
||||
} catch (CModelException exc) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -509,20 +513,36 @@ public class CModelBuilder2 implements IContributedModelBuilder {
|
|||
final IASTDeclSpecifier declSpecifier= declaration.getDeclSpecifier();
|
||||
final IASTDeclarator[] declarators= declaration.getDeclarators();
|
||||
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];
|
||||
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 && declarators.length > 1) {
|
||||
if (!isTemplate && element instanceof SourceManipulation) {
|
||||
setBodyPosition((SourceManipulation)element, declarator);
|
||||
}
|
||||
elements[i]= element;
|
||||
}
|
||||
} else {
|
||||
elements= new CElement[1];
|
||||
final CElement element= createSimpleDeclaration(parent, declSpecifier, null, isTemplate);
|
||||
elements[0]= element;
|
||||
}
|
||||
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 {
|
||||
if (declSpecifier instanceof IASTCompositeTypeSpecifier) {
|
||||
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);
|
||||
} 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) {
|
||||
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 createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
|
||||
} else {
|
||||
return createEnumeration(parent, (IASTEnumerationSpecifier)declSpecifier);
|
||||
}
|
||||
return createEnumeration(parent, (IASTEnumerationSpecifier)declSpecifier);
|
||||
} else if (declSpecifier instanceof IASTNamedTypeSpecifier) {
|
||||
return createTypedefOrFunctionOrVariable(parent, declSpecifier, declarator, isTemplate);
|
||||
} else if (declSpecifier instanceof IASTSimpleDeclSpecifier) {
|
||||
|
|
Loading…
Add table
Reference in a new issue