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:
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
|
* 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
|
||||||
|
|
|
@ -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) {
|
return createEnumeration(parent, (IASTEnumerationSpecifier)declSpecifier);
|
||||||
parent= (Parent)element;
|
|
||||||
if (!isTemplate) {
|
|
||||||
setBodyPosition((SourceManipulation)element, declSpecifier.getParent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue