From d9c4c2f676ef03cb4af4c83a733050c46a263751 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 9 Feb 2005 21:01:43 +0000 Subject: [PATCH] Patch for Devin Steffler. - group the IASTPreprocessorIncludeStatements and everything included by them - IASTPreprocessorIncludeStatement filter --- core/org.eclipse.cdt.ui.tests/plugin.xml | 8 ++ .../DOMAST/CPPPopulateASTViewAction.java | 42 +++++++++-- .../tests/DOMAST/CPopulateASTViewAction.java | 42 +++++++++-- .../tests/DOMAST/IncludeStatementFilter.java | 41 +++++++++++ .../cdt/ui/tests/DOMAST/TreeObject.java | 1 + .../cdt/ui/tests/DOMAST/TreeParent.java | 73 +++++++++++++++++-- 6 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/IncludeStatementFilter.java 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