mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Patch for John Camelon:
CORE Fixed Bug 36243 DomBuilder Offsetable List
This commit is contained in:
parent
45705e3e38
commit
080e040924
3 changed files with 110 additions and 12 deletions
|
@ -2,8 +2,10 @@ package org.eclipse.cdt.internal.core.dom;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -13,11 +15,9 @@ public class TranslationUnit implements IScope {
|
||||||
private List declarations = new LinkedList();
|
private List declarations = new LinkedList();
|
||||||
private List macros = new ArrayList();
|
private List macros = new ArrayList();
|
||||||
private List inclusions = new ArrayList();
|
private List inclusions = new ArrayList();
|
||||||
private List offsetables = new ArrayList();
|
|
||||||
|
|
||||||
public void addDeclaration(Declaration declaration) {
|
public void addDeclaration(Declaration declaration) {
|
||||||
declarations.add(declaration);
|
declarations.add(declaration);
|
||||||
offsetables.add(declaration);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List getDeclarations() {
|
public List getDeclarations() {
|
||||||
|
@ -40,21 +40,117 @@ public class TranslationUnit implements IScope {
|
||||||
|
|
||||||
public void addMacro(Macro macro) {
|
public void addMacro(Macro macro) {
|
||||||
macros.add(macro);
|
macros.add(macro);
|
||||||
offsetables.add(macro);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addInclusion(Inclusion inclusion) {
|
public void addInclusion(Inclusion inclusion) {
|
||||||
inclusions.add(inclusion);
|
inclusions.add(inclusion);
|
||||||
offsetables.add(inclusion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
public Iterator iterateOffsetableElements()
|
||||||
* Returns the offsetables.
|
{
|
||||||
* @return List
|
return new OffsetableIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OffsetableIterator implements Iterator
|
||||||
|
{
|
||||||
|
private final Iterator declarationIter;
|
||||||
|
private final Iterator inclusionIter;
|
||||||
|
private final Iterator macroIter;
|
||||||
|
|
||||||
|
private IOffsetable currentMacro = null, currentInclusion= null, currentDeclaration= null;
|
||||||
|
|
||||||
|
public OffsetableIterator()
|
||||||
|
{
|
||||||
|
declarationIter = getDeclarations().iterator();
|
||||||
|
inclusionIter = getInclusions().iterator();
|
||||||
|
macroIter = getMacros().iterator();
|
||||||
|
updateInclusionIterator();
|
||||||
|
updateDeclarationIterator();
|
||||||
|
updateMacroIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object updateDeclarationIterator()
|
||||||
|
{
|
||||||
|
Object offsetable = currentDeclaration;
|
||||||
|
currentDeclaration = ( declarationIter.hasNext() ) ? (IOffsetable)declarationIter.next() : null;
|
||||||
|
return offsetable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object updateMacroIterator()
|
||||||
|
{
|
||||||
|
Object offsetable = currentMacro;
|
||||||
|
currentMacro = ( macroIter.hasNext() ) ? (IOffsetable)macroIter.next() : null;
|
||||||
|
return offsetable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object updateInclusionIterator()
|
||||||
|
{
|
||||||
|
Object offsetable = currentInclusion;
|
||||||
|
currentInclusion = ( inclusionIter.hasNext() ) ? (IOffsetable)inclusionIter.next() : null;
|
||||||
|
return offsetable;
|
||||||
|
}
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.util.Iterator#hasNext()
|
||||||
*/
|
*/
|
||||||
public List getOffsetables() {
|
public boolean hasNext() {
|
||||||
return Collections.unmodifiableList( offsetables );
|
return (( currentMacro == null && currentInclusion == null && currentDeclaration == null ) ?
|
||||||
|
false : true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.util.Iterator#next()
|
||||||
|
*/
|
||||||
|
public Object next() {
|
||||||
|
// case 1: all are null
|
||||||
|
if( ! hasNext() )
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
|
||||||
|
// case 2: two of three are null
|
||||||
|
if( currentMacro == null && currentInclusion == null )
|
||||||
|
return updateDeclarationIterator();
|
||||||
|
if( currentDeclaration == null && currentInclusion == null )
|
||||||
|
return updateMacroIterator();
|
||||||
|
if( currentMacro == null && currentDeclaration == null )
|
||||||
|
return updateInclusionIterator();
|
||||||
|
|
||||||
|
// case 3: 1 is null
|
||||||
|
if( currentMacro == null )
|
||||||
|
if( currentDeclaration.getStartingOffset() < currentInclusion.getStartingOffset() )
|
||||||
|
return updateDeclarationIterator();
|
||||||
|
else
|
||||||
|
return updateInclusionIterator();
|
||||||
|
|
||||||
|
if( currentInclusion == null )
|
||||||
|
if( currentDeclaration.getStartingOffset() < currentMacro.getStartingOffset() )
|
||||||
|
return updateDeclarationIterator();
|
||||||
|
else
|
||||||
|
return updateMacroIterator();
|
||||||
|
|
||||||
|
if( currentDeclaration == null )
|
||||||
|
if( currentInclusion.getStartingOffset() < currentMacro.getStartingOffset() )
|
||||||
|
return updateInclusionIterator();
|
||||||
|
else
|
||||||
|
return updateMacroIterator();
|
||||||
|
|
||||||
|
// case 4: none are null
|
||||||
|
if( currentInclusion.getStartingOffset() < currentMacro.getStartingOffset() &&
|
||||||
|
currentInclusion.getStartingOffset() < currentDeclaration.getStartingOffset() )
|
||||||
|
return updateInclusionIterator();
|
||||||
|
|
||||||
|
if( currentMacro.getStartingOffset() < currentInclusion.getStartingOffset() &&
|
||||||
|
currentMacro.getStartingOffset() < currentDeclaration.getStartingOffset() )
|
||||||
|
return updateMacroIterator();
|
||||||
|
// only remaining case
|
||||||
|
return updateDeclarationIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.util.Iterator#remove()
|
||||||
|
*/
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException( "OffsetableIterator is a const iterator");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
2003-04-11 John Camelon
|
||||||
|
Fixed Bug 36243 DomBuilder Offsetable List
|
||||||
|
|
||||||
2003-04-10 John Camelon
|
2003-04-10 John Camelon
|
||||||
Fixed Bug36237 Parser fails on casts in ctor initializer.
|
Fixed Bug36237 Parser fails on casts in ctor initializer.
|
||||||
Added AccessSpecifier to TemplateDeclaration.
|
Added AccessSpecifier to TemplateDeclaration.
|
||||||
|
|
|
@ -65,8 +65,7 @@ public class CModelBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void generateModelElements(TranslationUnit tu){
|
protected void generateModelElements(TranslationUnit tu){
|
||||||
List offsetables = tu.getOffsetables();
|
Iterator i = tu.iterateOffsetableElements();
|
||||||
Iterator i = offsetables.iterator();
|
|
||||||
while (i.hasNext()){
|
while (i.hasNext()){
|
||||||
IOffsetable offsetable = (IOffsetable)i.next();
|
IOffsetable offsetable = (IOffsetable)i.next();
|
||||||
if(offsetable instanceof Inclusion){
|
if(offsetable instanceof Inclusion){
|
||||||
|
|
Loading…
Add table
Reference in a new issue