diff --git a/core/org.eclipse.cdt.ui.tests/icons/sample.gif b/core/org.eclipse.cdt.ui.tests/icons/sample.gif new file mode 100644 index 00000000000..7952e2ef215 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/sample.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif new file mode 100644 index 00000000000..8e8cac5a9d7 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/brkpd_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif new file mode 100644 index 00000000000..d079ebb14fa Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/cdeclaration_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif new file mode 100644 index 00000000000..b3ddb5deebc Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/define_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif b/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif new file mode 100644 index 00000000000..dbde1a090aa Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/disassembly.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif new file mode 100644 index 00000000000..a73f31a81f6 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/enumerator_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif new file mode 100644 index 00000000000..870df5c473a Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/expression_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif new file mode 100644 index 00000000000..0107e2ecc6c Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/jump_co.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif new file mode 100644 index 00000000000..18103b11fc7 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/method_public_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif new file mode 100644 index 00000000000..d90a51c0220 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/output_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif new file mode 100644 index 00000000000..a87ddbf9ca8 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/showasarray_co.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif b/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif new file mode 100644 index 00000000000..3976f8f7913 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/source_attach_attrib.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif new file mode 100644 index 00000000000..eccb83c6975 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/statement_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif b/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif new file mode 100644 index 00000000000..764201b3783 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/tnames_co.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/types.gif b/core/org.eclipse.cdt.ui.tests/icons/used/types.gif new file mode 100644 index 00000000000..5ba5b91c5bb Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/types.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif new file mode 100644 index 00000000000..74a3d222c70 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_declaration_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif new file mode 100644 index 00000000000..ca17bd232f6 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_pointer.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif b/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif new file mode 100644 index 00000000000..600d968f7cf Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/var_simple.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif new file mode 100644 index 00000000000..461c4e79feb Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/variable_local_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif new file mode 100644 index 00000000000..9fa6383efc9 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/variable_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif b/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif new file mode 100644 index 00000000000..cf8d571833d Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/warning_obj.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif b/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif new file mode 100644 index 00000000000..797b0e0e7b4 Binary files /dev/null and b/core/org.eclipse.cdt.ui.tests/icons/used/watch_globals.gif differ diff --git a/core/org.eclipse.cdt.ui.tests/plugin.xml b/core/org.eclipse.cdt.ui.tests/plugin.xml index 51d6d1b2015..87a40fc35d7 100644 --- a/core/org.eclipse.cdt.ui.tests/plugin.xml +++ b/core/org.eclipse.cdt.ui.tests/plugin.xml @@ -17,6 +17,9 @@ + + + @@ -37,6 +40,48 @@ id="org.eclipse.cdt.ui.tests.chelp.extension.3"/> + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000000..aa96859eb28 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java @@ -0,0 +1,165 @@ +/********************************************************************** + * 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.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; +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.cpp.CPPVisitor.CPPBaseVisitorAction; + +/** + * @author dsteffle + */ +public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IPopulateDOMASTAction { + { + processNames = true; + processDeclarations = true; + processInitializers = true; + processParameterDeclarations = true; + processDeclarators = true; + processDeclSpecifiers = true; + processExpressions = true; + processStatements = true; + processTypeIds = true; + processEnumerators = true; + processBaseSpecifiers = true; + processNamespaces = true; + } + + TreeParent root = null; + + public CPPPopulateASTViewAction(IASTTranslationUnit tu) { + root = new TreeParent(tu); + } + + private void addRoot(IASTNode node) { + TreeParent parent = root.findParentOfNode(node); + + if ( parent != null ) { + parent.addChild(new TreeParent(node)); + } else { + root.addChild(new TreeParent(node)); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) + */ + public int processDeclaration(IASTDeclaration declaration) { + addRoot(declaration); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) + */ + public int processDeclarator(IASTDeclarator declarator) { + addRoot(declarator); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processBaseSpecifier(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier) + */ + public int processBaseSpecifier(ICPPASTBaseSpecifier specifier) { + addRoot(specifier); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier) + */ + public int processDeclSpecifier(IASTDeclSpecifier declSpec) { + addRoot(declSpec); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) + */ + public int processEnumerator(IASTEnumerator enumerator) { + addRoot(enumerator); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression) + */ + public int processExpression(IASTExpression expression) { + addRoot(expression); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer) + */ + public int processInitializer(IASTInitializer initializer) { + addRoot(initializer); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int processName(IASTName name) { + addRoot(name); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processNamespace(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition) + */ + public int processNamespace(ICPPASTNamespaceDefinition namespace) { + addRoot(namespace); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) + */ + public int processParameterDeclaration( + IASTParameterDeclaration parameterDeclaration) { + addRoot(parameterDeclaration); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement) + */ + public int processStatement(IASTStatement statement) { + addRoot(statement); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) + */ + public int processTypeId(IASTTypeId typeId) { + addRoot(typeId); + return PROCESS_CONTINUE; + } + + public TreeParent getTree() { + return root; + } +} 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 new file mode 100644 index 00000000000..354b91fe955 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPopulateASTViewAction.java @@ -0,0 +1,146 @@ +/********************************************************************** + * 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.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction; + +/** + * @author dsteffle + */ +public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopulateDOMASTAction { + { + processNames = true; + processDeclarations = true; + processInitializers = true; + processParameterDeclarations = true; + processDeclarators = true; + processDeclSpecifiers = true; + processExpressions = true; + processStatements = true; + processTypeIds = true; + processEnumerators = true; + } + + TreeParent root = null; // TODO what about using a hashtable/hashmap for the tree? + + public CPopulateASTViewAction(IASTTranslationUnit tu) { + root = new TreeParent(tu); + } + + private void addRoot(IASTNode node) { + TreeParent parent = root.findParentOfNode(node); + + if ( parent != null ) { + parent.addChild(new TreeParent(node)); + } else { + root.addChild(new TreeParent(node)); + } + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) + */ + public int processDeclaration(IASTDeclaration declaration) { + addRoot(declaration); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) + */ + public int processDeclarator(IASTDeclarator declarator) { + addRoot(declarator); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier) + */ + public int processDeclSpecifier(IASTDeclSpecifier declSpec) { + addRoot(declSpec); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) + */ + public int processEnumerator(IASTEnumerator enumerator) { + addRoot(enumerator); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression) + */ + public int processExpression(IASTExpression expression) { + addRoot(expression); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer) + */ + public int processInitializer(IASTInitializer initializer) { + addRoot(initializer); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int processName(IASTName name) { + addRoot(name); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) + */ + public int processParameterDeclaration( + IASTParameterDeclaration parameterDeclaration) { + addRoot(parameterDeclaration); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement) + */ + public int processStatement(IASTStatement statement) { + addRoot(statement); + return PROCESS_CONTINUE; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) + */ + public int processTypeId(IASTTypeId typeId) { + addRoot(typeId); + return PROCESS_CONTINUE; + } + + public TreeParent getTree() { + return root; + } + +} diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java new file mode 100644 index 00000000000..8f0fd355692 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMAST.java @@ -0,0 +1,535 @@ +/********************************************************************** + * 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 java.io.IOException; +import java.util.Hashtable; +import java.util.Map; + +import org.eclipse.cdt.ui.tests.DOMAST.DOMASTPluginImages; +import org.eclipse.cdt.ui.tests.DOMAST.CPPPopulateASTViewAction; +import org.eclipse.cdt.ui.tests.DOMAST.CPopulateASTViewAction; +import org.eclipse.cdt.ui.tests.DOMAST.IPopulateDOMASTAction; +import org.eclipse.cdt.ui.tests.DOMAST.TreeObject; +import org.eclipse.cdt.ui.tests.DOMAST.TreeParent; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.*; +import org.eclipse.jface.viewers.*; +import org.eclipse.swt.graphics.Image; +import org.eclipse.jface.action.*; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.ui.*; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.SWT; +import org.eclipse.cdt.core.parser.CodeReader; +import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.cdt.core.parser.NullLogService; +import org.eclipse.cdt.core.parser.NullSourceElementRequestor; +import org.eclipse.cdt.core.parser.ParserFactory; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.core.parser.IScanner; +import org.eclipse.cdt.core.parser.ParserMode; +import org.eclipse.cdt.core.parser.ScannerInfo; +import org.eclipse.cdt.core.parser.ast.IASTEnumerator; +import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; +import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; +import org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction; +import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration; +import org.eclipse.cdt.internal.ui.editor.CEditor; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; + + +/** + * This sample class demonstrates how to plug-in a new + * workbench view. The view shows data obtained from the + * model. The sample creates a dummy model on the fly, + * but a real implementation would connect to the model + * available either in this or another plug-in (e.g. the workspace). + * The view is connected to the model using a content provider. + *

+ * The view uses a label provider to define how model + * objects should be presented in the view. Each + * view can present the same model objects using + * different labels and icons, if needed. Alternatively, + * a single label provider can be shared between views + * in order to ensure that objects of the same type are + * presented in the same way everywhere. + *

+ */ + +public class DOMAST extends ViewPart { + private static final String VIEW_NAME = "DOM View"; //$NON-NLS-1$ + private static final String POPUPMENU = "#PopupMenu"; //$NON-NLS-1$ + private static final String OPEN_DEFINITIONS = "Open Definitions"; //$NON-NLS-1$ + private static final String OPEN_REFERENCES = "Open References"; //$NON-NLS-1$ + private TreeViewer viewer; + private DrillDownAdapter drillDownAdapter; + private Action action1; + private Action action2; + private Action singleClickAction; + private IFile file = null; + private IEditorPart part = null; + private ParserLanguage lang = null; + + /* + * The content provider class is responsible for + * providing objects to the view. It can wrap + * existing objects in adapters or simply return + * objects as-is. These objects may be sensitive + * to the current input of the view, or ignore + * it and always show the same content + * (like Task List, for example). + */ + + public class ViewContentProvider implements IStructuredContentProvider, + ITreeContentProvider { + private TreeParent invisibleRoot; + private IFile aFile = null; + + /** + * + */ + public ViewContentProvider() {} + + /** + * + */ + public ViewContentProvider(IFile file) { + this.aFile = file; + } + + public void inputChanged(Viewer v, Object oldInput, Object newInput) { + } + public void dispose() { + } + public Object[] getElements(Object parent) { + if (parent.equals(getViewSite())) { + if (invisibleRoot==null) initialize(); + return getChildren(invisibleRoot); + } + return getChildren(parent); + } + public Object getParent(Object child) { + if (child instanceof TreeObject) { + return ((TreeObject)child).getParent(); + } + return null; + } + public Object [] getChildren(Object parent) { + if (parent instanceof TreeParent) { + return ((TreeParent)parent).getChildren(); + } + return new Object[0]; + } + public boolean hasChildren(Object parent) { + if (parent instanceof TreeParent) + return ((TreeParent)parent).hasChildren(); + return false; + } + + private void initialize() { + if ( aFile == null || lang == null) return; + + IPopulateDOMASTAction action = null; + + // TODO could use something like below to work with working copy... i.e. refresh button +// IProject currentProject = aFile.getProject(); +// IWorkingCopy workingCopy = null; +// if( editor.isDirty() ){ +// IWorkingCopy [] workingCopies = CUIPlugin.getSharedWorkingCopies(); +// if( workingCopies != null ){ +// for( int i = 0; i < workingCopies.length; i++ ){ +// if( workingCopies[i].getUnderlyingResource().equals( file ) ){ +// workingCopy = workingCopies[i]; +// break; +// } +// } +// } +// } + + CodeReader reader = null; + try { +// if( workingCopy == null ) + reader = new CodeReader(aFile.getLocation().toOSString(), aFile.getCharset() ); +// else +// reader = new CodeReader(file.getLocation().toOSString(), workingCopy.getContents()); + } catch (IOException e) { + e.printStackTrace(); + } catch ( CoreException e ) { + e.printStackTrace(); + } + + // get IFile +// IWorkspace workspace= ResourcesPlugin.getWorkspace(); +// workspace.setDescription(desc); +// getWorkbench().getActiveWorkbenchWindow(); + + // parse IFile + ParserMode mode = ParserMode.COMPLETE_PARSE; + Map definitions = new Hashtable(); + + String [] includePaths = new String[0]; + IScannerInfo scannerInfo = new ScannerInfo( definitions, includePaths ); + IScanner scanner = ParserFactory.createScanner( + reader, + scannerInfo, + mode, + lang, + new NullSourceElementRequestor(), + null, + null ); + AbstractGNUSourceCodeParser parser = null; + if ( lang == ParserLanguage.C ) { + parser = new GNUCSourceParser( + scanner, + mode, + new NullLogService(), + new GCCParserExtensionConfiguration() + ); + + IASTTranslationUnit tu = parser.parse(); + + action = new CPopulateASTViewAction(tu); + CVisitor.visitTranslationUnit(tu, (CBaseVisitorAction)action); + } else if ( lang == ParserLanguage.CPP ){ + parser = new GNUCPPSourceParser( + scanner, + mode, + new NullLogService(), + new GPPParserExtensionConfiguration() + ); + + IASTTranslationUnit tu = parser.parse(); + + action = new CPPPopulateASTViewAction(tu); + CPPVisitor.visitTranslationUnit(tu, (CPPBaseVisitorAction)action); + } + + // display roots + invisibleRoot = new TreeParent(null); //$NON-NLS-1$ + invisibleRoot.addChild(action.getTree()); + + } + } + + class ViewLabelProvider extends LabelProvider { + + public String getText(Object obj) { + return obj.toString(); + } + public Image getImage(Object obj) { + String imageKey = DOMASTPluginImages.IMG_DEFAULT; + + IASTNode node = null; + if (obj instanceof TreeObject) { + node = ((TreeObject)obj).getNode(); + } + + if ( node instanceof IASTArrayModifier ) { + imageKey = DOMASTPluginImages.IMG_IASTArrayModifier; + } else if ( node instanceof IASTDeclaration ) { + imageKey = DOMASTPluginImages.IMG_IASTDeclaration; + } else if ( node instanceof IASTDeclarator ) { + imageKey = DOMASTPluginImages.IMG_IASTDeclarator; + } else if ( node instanceof IASTDeclSpecifier ) { + imageKey = DOMASTPluginImages.IMG_IASTDeclSpecifier; + } else if ( node instanceof IASTEnumerator ) { + imageKey = DOMASTPluginImages.IMG_IASTEnumerator; + } else if ( node instanceof IASTExpression ) { + imageKey = DOMASTPluginImages.IMG_IASTExpression; + } else if ( node instanceof IASTInitializer ) { + imageKey = DOMASTPluginImages.IMG_IASTInitializer; + } else if ( node instanceof IASTName ) { + imageKey = DOMASTPluginImages.IMG_IASTName; + } else if ( node instanceof IASTParameterDeclaration ) { + imageKey = DOMASTPluginImages.IMG_IASTParameterDeclaration; + } else if ( node instanceof IASTPointerOperator ) { + imageKey = DOMASTPluginImages.IMG_IASTPointerOperator; + } else if ( node instanceof IASTPreprocessorStatement ) { + imageKey = DOMASTPluginImages.IMG_IASTPreprocessorStatement; + } else if ( node instanceof IASTProblem ) { + imageKey = DOMASTPluginImages.IMG_IASTProblem; + } else if ( node instanceof IASTSimpleDeclaration ) { + imageKey = DOMASTPluginImages.IMG_IASTSimpleDeclaration; + } else if ( node instanceof IASTStatement ) { + imageKey = DOMASTPluginImages.IMG_IASTStatement; + } else if ( node instanceof IASTTranslationUnit ) { + imageKey = DOMASTPluginImages.IMG_IASTTranslationUnit; + } else if ( node instanceof IASTTypeId ) { + imageKey = DOMASTPluginImages.IMG_IASTTypeId; + } else if ( node instanceof ICASTDesignator ) { + imageKey = DOMASTPluginImages.IMG_ICASTDesignator; + } else if ( node instanceof ICPPASTConstructorChainInitializer ) { + imageKey = DOMASTPluginImages.IMG_ICPPASTConstructorChainInitializer; + } else if ( node instanceof ICPPASTTemplateParameter ) { + imageKey = DOMASTPluginImages.IMG_ICPPASTTemplateParameter; + } + + return DOMASTPluginImages.get(imageKey); + } + } + class NameSorter extends ViewerSorter { + } + + public DOMAST() { + + } + + /** + * This is a callback that will allow us + * to create the viewer and initialize it. + */ + public void createPartControl(Composite parent) { + + if (part == null) { + IWorkbenchPage[] pages = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages(); + + if (pages.length == 0) { + // TODO determine how to hide view if no pages found and part==null + } + + outerLoop: for(int i=0; i0; + } + + private TreeParent findParentOfNode(TreeObject[] trees, IASTNode node) { + for (int i=0; i