diff --git a/core/org.eclipse.cdt.ui.tests/plugin.xml b/core/org.eclipse.cdt.ui.tests/plugin.xml
index f2cb3416536..de56ee8b84d 100644
--- a/core/org.eclipse.cdt.ui.tests/plugin.xml
+++ b/core/org.eclipse.cdt.ui.tests/plugin.xml
@@ -111,6 +111,14 @@
class="org.eclipse.cdt.ui.tests.DOMAST.PreprocessorFilter"
id="org.eclipse.cdt.ui.tests.DOMAST.DOMAST.PreprocessorFilter">
+
+
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
index 4fab44a029c..90ea81c50c0 100644
--- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java
@@ -38,6 +38,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction;
+import org.eclipse.cdt.internal.core.parser.scanner2.LocationMap.ASTInclusionStatement;
/**
* @author dsteffle
@@ -67,7 +68,7 @@ public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IP
private void addRoot(IASTNode node) {
if (node == null) return;
- TreeParent parent = root.findParentOfNode(node);
+ TreeParent parent = root.findTreeParentForNode(node);
if (parent == null)
parent = root;
@@ -76,12 +77,12 @@ public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IP
parent.addChild(tree);
// set filter flags
- if (node instanceof IASTProblemHolder)
- tree.setFiltersFlag(TreeObject.FLAG_PROBLEM);
- if (node instanceof IASTProblem)
+ if (node instanceof IASTProblemHolder || node instanceof IASTProblem)
tree.setFiltersFlag(TreeObject.FLAG_PROBLEM);
if (node instanceof IASTPreprocessorStatement)
tree.setFiltersFlag(TreeObject.FLAG_PREPROCESSOR);
+ if (node instanceof IASTPreprocessorIncludeStatement)
+ tree.setFiltersFlag(TreeObject.FLAG_INCLUDE_STATEMENTS);
}
/* (non-Javadoc)
@@ -246,9 +247,40 @@ public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IP
mergePreprocessorProblems(tu.getPreprocesorProblems());
// merge include directives
- mergeIncludeDirectives(tu.getIncludeDirectives());
+ IASTPreprocessorIncludeStatement[] includes = tu.getIncludeDirectives();
+ mergeIncludeDirectives(includes);
+
+ // group #includes
+ groupIncludes(includes);
}
return root;
}
+
+ private void groupIncludes(IASTPreprocessorIncludeStatement[] includes) {
+ // get the tree model elements corresponding to the includes
+ TreeParent[] treeIncludes = new TreeParent[includes.length];
+ for (int i=0; i=0; i--) {
+ if (treeIncludes[i] == null) continue;
+
+ for(int j=root.getChildren().length-1; j>=0; j--) {
+ child = root.getChildren()[j];
+
+ if (treeIncludes[i] != child &&
+ includes[i] instanceof ASTInclusionStatement &&
+ ((ASTNode)child.getNode()).getOffset() >= ((ASTInclusionStatement)includes[i]).startOffset &&
+ ((ASTNode)child.getNode()).getOffset() <= ((ASTInclusionStatement)includes[i]).endOffset) {
+ root.removeChild(child);
+ treeIncludes[i].addChild(child);
+ }
+ }
+ }
+ }
}
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
index 1d0610fbd11..490d683405b 100644
--- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java
@@ -34,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction;
+import org.eclipse.cdt.internal.core.parser.scanner2.LocationMap.ASTInclusionStatement;
/**
* @author dsteffle
@@ -68,7 +69,7 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul
nodeLocations[0].getNodeLength() > 0))
return;
- TreeParent parent = root.findParentOfNode(node);
+ TreeParent parent = root.findTreeParentForNode(node);
if (parent == null)
parent = root;
@@ -77,12 +78,12 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul
parent.addChild(tree);
// set filter flags
- if (node instanceof IASTProblemHolder)
- tree.setFiltersFlag(TreeObject.FLAG_PROBLEM);
- if (node instanceof IASTProblem)
+ if (node instanceof IASTProblemHolder || node instanceof IASTProblem)
tree.setFiltersFlag(TreeObject.FLAG_PROBLEM);
if (node instanceof IASTPreprocessorStatement)
tree.setFiltersFlag(TreeObject.FLAG_PREPROCESSOR);
+ if (node instanceof IASTPreprocessorIncludeStatement)
+ tree.setFiltersFlag(TreeObject.FLAG_INCLUDE_STATEMENTS);
}
/* (non-Javadoc)
@@ -225,10 +226,41 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul
mergePreprocessorProblems(tu.getPreprocesorProblems());
// merge include directives
- mergeIncludeDirectives(tu.getIncludeDirectives());
+ IASTPreprocessorIncludeStatement[] includes = tu.getIncludeDirectives();
+ mergeIncludeDirectives(includes);
+
+ // group #includes
+ groupIncludes(includes);
}
return root;
}
+
+ private void groupIncludes(IASTPreprocessorIncludeStatement[] includes) {
+ // get the tree model elements corresponding to the includes
+ TreeParent[] treeIncludes = new TreeParent[includes.length];
+ for (int i=0; i=0; i--) {
+ if (treeIncludes[i] == null) continue;
+
+ for(int j=root.getChildren().length-1; j>=0; j--) {
+ child = root.getChildren()[j];
+
+ if (treeIncludes[i] != child &&
+ includes[i] instanceof ASTInclusionStatement &&
+ ((ASTNode)child.getNode()).getOffset() >= ((ASTInclusionStatement)includes[i]).startOffset &&
+ ((ASTNode)child.getNode()).getOffset() <= ((ASTInclusionStatement)includes[i]).endOffset) {
+ root.removeChild(child);
+ treeIncludes[i].addChild(child);
+ }
+ }
+ }
+ }
}
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/IncludeStatementFilter.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/IncludeStatementFilter.java
new file mode 100644
index 00000000000..9c2b9d3ecea
--- /dev/null
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/IncludeStatementFilter.java
@@ -0,0 +1,41 @@
+/**********************************************************************
+ * Copyright (c) 2005 IBM Canada and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.cdt.ui.tests.DOMAST;
+
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * @author dsteffle
+ */
+public class IncludeStatementFilter extends ViewerFilter {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof TreeObject) {
+ int flag = ((TreeObject)element).getFiltersFlag() & TreeObject.FLAG_INCLUDE_STATEMENTS;
+ if (flag > 0) {
+ IASTNode node = ((TreeObject)element).getNode();
+ if (node instanceof IASTPreprocessorIncludeStatement)
+ return false;
+
+ return true;
+ }
+ }
+
+ return true;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
index dbcd7fd363c..7a4613fbfab 100644
--- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeObject.java
@@ -122,6 +122,7 @@ public class TreeObject implements IAdaptable {
private int filterFlag = 0;
public static final int FLAG_PROBLEM = 0x1;
public static final int FLAG_PREPROCESSOR = 0x2;
+ public static final int FLAG_INCLUDE_STATEMENTS = 0x2;
public TreeObject(IASTNode node) {
this.node = node;
diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
index f1241446754..86110fbe966 100644
--- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
+++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/TreeParent.java
@@ -14,6 +14,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
/**
@@ -60,14 +61,21 @@ public class TreeParent extends TreeObject {
return children.size()>0;
}
- private TreeParent findParentOfNode(TreeObject[] trees, IASTNode node) {
+ /**
+ * Returns the TreeParent whose IASTNode is the parent of the IASTNode.
+ *
+ * @param trees
+ * @param node
+ * @return
+ */
+ private TreeParent findTreeParentForNode(TreeObject[] trees, IASTNode node) {
for (int i=0; i