1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Further DOM/AST fixes (w/viewer).

This commit is contained in:
John Camelon 2005-01-26 20:21:07 +00:00
parent d7b97a7f42
commit b811a0479b
5 changed files with 547 additions and 514 deletions

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
@ -166,4 +167,17 @@ public class DOMLocationTests extends AST2BaseTest {
assertSoleLocation( expression, code.indexOf( "return ") + "return ".length(), 1 ); //$NON-NLS-1$ //$NON-NLS-2$ assertSoleLocation( expression, code.indexOf( "return ") + "return ".length(), 1 ); //$NON-NLS-1$ //$NON-NLS-2$
} }
public void testElaboratedTypeSpecifier() throws ParserException {
String code = "/* blah */ struct A anA; /* blah */"; //$NON-NLS-1$
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
: null) {
IASTTranslationUnit tu = parse(code, p);
IASTSimpleDeclaration declaration = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTElaboratedTypeSpecifier elabType = (IASTElaboratedTypeSpecifier) declaration.getDeclSpecifier();
assertSoleLocation( elabType, code.indexOf( "struct"), "struct A".length() ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
} }

View file

@ -1672,6 +1672,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
name.setParent(result); name.setParent(result);
name.setPropertyInParent(IASTElaboratedTypeSpecifier.TYPE_NAME); name.setPropertyInParent(IASTElaboratedTypeSpecifier.TYPE_NAME);
result.setKind(eck); result.setKind(eck);
((ASTNode)result).setOffsetAndLength( t.getOffset(), calculateEndOffset(name) - t.getOffset() );
return result; return result;
} }

View file

@ -37,9 +37,14 @@ import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguratio
import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; 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.core.dom.parser.cpp.ICPPParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.InternalParserUtil;
import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner;
import org.eclipse.cdt.internal.core.parser.scanner2.GCCScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.GPPScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
@ -50,7 +55,9 @@ import org.eclipse.core.runtime.CoreException;
*/ */
public class InternalASTServiceProvider implements IASTServiceProvider { public class InternalASTServiceProvider implements IASTServiceProvider {
private static final String[] dialects = { "C99", //$NON-NLS-1$ protected static final GCCScannerExtensionConfiguration C_GNU_SCANNER_EXTENSION = new GCCScannerExtensionConfiguration();
protected static final GPPScannerExtensionConfiguration CPP_GNU_SCANNER_EXTENSION = new GPPScannerExtensionConfiguration();
private static final String[] dialects = { "C99", //$NON-NLS-1$
"C++98", //$NON-NLS-1$ "C++98", //$NON-NLS-1$
"GNUC", //$NON-NLS-1$ "GNUC", //$NON-NLS-1$
"GNUC++" }; //$NON-NLS-1$ "GNUC++" }; //$NON-NLS-1$
@ -110,9 +117,14 @@ public class InternalASTServiceProvider implements IASTServiceProvider {
if( configuration == null ) if( configuration == null )
{ {
ParserLanguage l = getLanguage(fileToParse); ParserLanguage l = getLanguage(fileToParse);
scanner = ParserFactory.createScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE, IScannerExtensionConfiguration scannerExtensionConfiguration = null;
l, NULL_REQUESTOR, if( l == ParserLanguage.CPP )
ParserUtil.getScannerLogService(), Collections.EMPTY_LIST); scannerExtensionConfiguration = CPP_GNU_SCANNER_EXTENSION;
else
scannerExtensionConfiguration = C_GNU_SCANNER_EXTENSION;
scanner = new DOMScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE,
l, ParserFactory.createDefaultLogService(), scannerExtensionConfiguration, fileCreator );
//assume GCC //assume GCC
if( l == ParserLanguage.C ) if( l == ParserLanguage.C )
parser = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE, ParserUtil.getParserLogService(), new GCCParserExtensionConfiguration() ); parser = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE, ParserUtil.getParserLogService(), new GCCParserExtensionConfiguration() );

View file

@ -10,36 +10,8 @@
**********************************************************************/ **********************************************************************/
package org.eclipse.cdt.ui.tests.DOMAST; 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.CDOM; import org.eclipse.cdt.core.dom.CDOM;
import org.eclipse.cdt.core.dom.IASTServiceProvider;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@ -59,499 +31,522 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; 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.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser; import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; 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.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;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction; 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.core.parser.InternalParserUtil;
import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner;
import org.eclipse.cdt.internal.core.parser.scanner2.GCCScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.GPPScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration;
import org.eclipse.cdt.internal.ui.editor.CEditor; import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
/** /**
* This sample class demonstrates how to plug-in a new * This sample class demonstrates how to plug-in a new workbench view. The view
* workbench view. The view shows data obtained from the * shows data obtained from the model. The sample creates a dummy model on the
* model. The sample creates a dummy model on the fly, * fly, but a real implementation would connect to the model available either in
* but a real implementation would connect to the model * this or another plug-in (e.g. the workspace). The view is connected to the
* available either in this or another plug-in (e.g. the workspace). * model using a content provider.
* The view is connected to the model using a content provider.
* <p> * <p>
* The view uses a label provider to define how model * The view uses a label provider to define how model objects should be
* objects should be presented in the view. Each * presented in the view. Each view can present the same model objects using
* view can present the same model objects using * different labels and icons, if needed. Alternatively, a single label provider
* different labels and icons, if needed. Alternatively, * can be shared between views in order to ensure that objects of the same type
* a single label provider can be shared between views * are presented in the same way everywhere.
* in order to ensure that objects of the same type are
* presented in the same way everywhere.
* <p> * <p>
*/ */
public class DOMAST extends ViewPart { public class DOMAST extends ViewPart {
private static final String REFRESH_DOM_AST = "Refresh DOM AST"; //$NON-NLS-1$ private static final String REFRESH_DOM_AST = "Refresh DOM AST"; //$NON-NLS-1$
private static final String VIEW_NAME = "DOM View"; //$NON-NLS-1$ private static final String VIEW_NAME = "DOM View"; //$NON-NLS-1$
private static final String POPUPMENU = "#PopupMenu"; //$NON-NLS-1$ private static final String POPUPMENU = "#PopupMenu"; //$NON-NLS-1$
private static final String OPEN_DECLARATIONS = "Open Declarations"; //$NON-NLS-1$ private static final String OPEN_DECLARATIONS = "Open Declarations"; //$NON-NLS-1$
private static final String OPEN_REFERENCES = "Open References"; //$NON-NLS-1$ private static final String OPEN_REFERENCES = "Open References"; //$NON-NLS-1$
private TreeViewer viewer; TreeViewer viewer;
private DrillDownAdapter drillDownAdapter; private DrillDownAdapter drillDownAdapter;
private Action action1; private Action action1;
private Action action2; private Action action2;
private Action singleClickAction; private Action singleClickAction;
private Action refreshAction; private Action refreshAction;
private IFile file = null; private IFile file = null;
private IEditorPart part = null; private IEditorPart part = null;
ParserLanguage lang = null; ParserLanguage lang = null;
/* /*
* The content provider class is responsible for * The content provider class is responsible for providing objects to the
* providing objects to the view. It can wrap * view. It can wrap existing objects in adapters or simply return objects
* existing objects in adapters or simply return * as-is. These objects may be sensitive to the current input of the view, or
* objects as-is. These objects may be sensitive * ignore it and always show the same content (like Task List, for example).
* 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, public class ViewContentProvider implements IStructuredContentProvider,
ITreeContentProvider { ITreeContentProvider {
private TreeParent invisibleRoot; private TreeParent invisibleRoot;
private IFile aFile = null; private IFile aFile = null;
/** /**
* *
*/ */
public ViewContentProvider() {} public ViewContentProvider() {
}
/** /**
* *
*/ */
public ViewContentProvider(IFile file) { public ViewContentProvider(IFile file) {
this.aFile = file; this.aFile = file;
} }
public void inputChanged(Viewer v, Object oldInput, Object newInput) { 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() { public void dispose() {
if ( aFile == null || lang == null) return; }
IPopulateDOMASTAction action = null; public Object[] getElements(Object parent) {
if (parent.equals(getViewSite())) {
if (invisibleRoot == null)
initialize();
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
// TODO could use something like below to work with working copy... i.e. refresh button public Object getParent(Object child) {
// IProject currentProject = aFile.getProject(); if (child instanceof TreeObject) {
// IWorkingCopy workingCopy = null; return ((TreeObject) child).getParent();
// if( editor.isDirty() ){ }
// IWorkingCopy [] workingCopies = CUIPlugin.getSharedWorkingCopies(); return null;
// if( workingCopies != null ){ }
// for( int i = 0; i < workingCopies.length; i++ ){
// if( workingCopies[i].getUnderlyingResource().equals( file ) ){
// workingCopy = workingCopies[i];
// break;
// }
// }
// }
// }
CodeReader reader = null; public Object[] getChildren(Object parent) {
try { if (parent instanceof TreeParent) {
// if( workingCopy == null ) return ((TreeParent) parent).getChildren();
reader = new CodeReader(aFile.getLocation().toOSString(), aFile.getCharset() ); }
// else return new Object[0];
// reader = new CodeReader(aFile.getLocation().toOSString(), workingCopy.getContents()); }
} catch (IOException e) {
e.printStackTrace();
} catch ( CoreException e ) {
e.printStackTrace();
}
// get IFile public boolean hasChildren(Object parent) {
// IWorkspace workspace= ResourcesPlugin.getWorkspace(); if (parent instanceof TreeParent)
// workspace.setDescription(desc); return ((TreeParent) parent).hasChildren();
// getWorkbench().getActiveWorkbenchWindow(); return false;
}
// parse IFile private void initialize() {
ParserMode mode = ParserMode.COMPLETE_PARSE; if (aFile == null || lang == null)
Map definitions = new Hashtable(); return;
String [] includePaths = new String[0]; IPopulateDOMASTAction action = null;
IScannerInfo scannerInfo = new ScannerInfo( definitions, includePaths ); IASTTranslationUnit tu = null;
IScannerExtensionConfiguration configuration = null; try {
if( lang == ParserLanguage.CPP ) tu = CDOM.getInstance().getDefaultASTService().getTranslationUnit(
configuration = new GPPScannerExtensionConfiguration(); aFile,
else CDOM.getInstance().getCodeReaderFactory(
configuration = new GCCScannerExtensionConfiguration(); CDOM.PARSE_SAVED_RESOURCES));
} catch (IASTServiceProvider.UnsupportedDialectException e) {
return;
}
if (lang == ParserLanguage.CPP) {
action = new CPPPopulateASTViewAction(tu);
CPPVisitor.visitTranslationUnit(tu, (CPPBaseVisitorAction) action);
} else {
action = new CPopulateASTViewAction(tu);
CVisitor.visitTranslationUnit(tu, (CBaseVisitorAction) action);
}
// display roots
invisibleRoot = new TreeParent(null); //$NON-NLS-1$
invisibleRoot.addChild(action.getTree());
}
}
IScanner scanner = new DOMScanner( reader, scannerInfo, mode, lang, ParserFactory.createDefaultLogService(), configuration, CDOM.getInstance().getCodeReaderFactory( CDOM.PARSE_SAVED_RESOURCES) ); class ViewLabelProvider extends LabelProvider {
// reader, public String getText(Object obj) {
// scannerInfo, return obj.toString();
// 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(); public Image getImage(Object obj) {
String imageKey = DOMASTPluginImages.IMG_DEFAULT;
action = new CPopulateASTViewAction(tu); IASTNode node = null;
CVisitor.visitTranslationUnit(tu, (CBaseVisitorAction)action); if (obj instanceof TreeObject) {
} else if ( lang == ParserLanguage.CPP ){ node = ((TreeObject) obj).getNode();
parser = new GNUCPPSourceParser( }
scanner,
mode,
new NullLogService(),
new GPPParserExtensionConfiguration()
);
IASTTranslationUnit tu = parser.parse(); 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;
}
action = new CPPPopulateASTViewAction(tu); return DOMASTPluginImages.get(imageKey);
CPPVisitor.visitTranslationUnit(tu, (CPPBaseVisitorAction)action); }
} }
// display roots class NameSorter extends ViewerSorter {
invisibleRoot = new TreeParent(null); //$NON-NLS-1$ }
invisibleRoot.addChild(action.getTree());
} public DOMAST() {
}
class ViewLabelProvider extends LabelProvider { }
public String getText(Object obj) { /**
return obj.toString(); * This is a callback that will allow us to create the viewer and initialize
} * it.
public Image getImage(Object obj) { */
String imageKey = DOMASTPluginImages.IMG_DEFAULT; public void createPartControl(Composite parent) {
IASTNode node = null; if (part == null) {
if (obj instanceof TreeObject) { IWorkbenchPage[] pages = PlatformUI.getWorkbench()
node = ((TreeObject)obj).getNode(); .getActiveWorkbenchWindow().getPages();
}
if ( node instanceof IASTArrayModifier ) { if (pages.length == 0) {
imageKey = DOMASTPluginImages.IMG_IASTArrayModifier; // TODO determine how to hide view if no pages found and part==null
} 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); outerLoop: for (int i = 0; i < pages.length; i++) {
} IEditorReference[] editorRefs = pages[i].getEditorReferences();
} for (int j = 0; j < editorRefs.length; j++) {
class NameSorter extends ViewerSorter { part = editorRefs[j].getEditor(false);
} if (part instanceof CEditor) {
// TODO set the language properly if implement the above TODO
lang = ParserLanguage.CPP;
break outerLoop;
}
}
}
public DOMAST() { if (PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage() != null
&& PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor() != null)
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
}
} viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
drillDownAdapter = new DrillDownAdapter(viewer);
/** if (part instanceof CEditor)
* This is a callback that will allow us viewer.setContentProvider(new ViewContentProvider(((CEditor) part)
* to create the viewer and initialize it. .getInputFile()));
*/ else
public void createPartControl(Composite parent) { viewer.setContentProvider(new ViewContentProvider(file));
if (part == null) { viewer.setLabelProvider(new ViewLabelProvider());
IWorkbenchPage[] pages = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages(); viewer.setInput(getViewSite());
makeActions();
hookContextMenu();
hookSingleClickAction();
contributeToActionBars();
}
if (pages.length == 0) { public void setContentProvider(ViewContentProvider vcp) {
// TODO determine how to hide view if no pages found and part==null viewer.setContentProvider(vcp);
} }
outerLoop: for(int i=0; i<pages.length; i++) { private void hookContextMenu() {
IEditorReference[] editorRefs = pages[i].getEditorReferences(); MenuManager menuMgr = new MenuManager(POPUPMENU);
for (int j=0; j<editorRefs.length; j++) { menuMgr.setRemoveAllWhenShown(true);
part = editorRefs[j].getEditor(false); menuMgr.addMenuListener(new IMenuListener() {
if (part instanceof CEditor) { public void menuAboutToShow(IMenuManager manager) {
// TODO set the language properly if implement the above TODO DOMAST.this.fillContextMenu(manager);
lang = ParserLanguage.CPP; IContributionItem[] items = manager.getItems();
break outerLoop; for (int i = 0; i < items.length; i++) {
} if (items[i] instanceof ActionContributionItem
} && (((ActionContributionItem) items[i]).getAction()
} .getText().equals(OPEN_REFERENCES) || ((ActionContributionItem) items[i])
.getAction().getText().equals(OPEN_DECLARATIONS))) {
if (viewer.getSelection() instanceof StructuredSelection
&& ((StructuredSelection) viewer.getSelection())
.getFirstElement() instanceof TreeObject
&& ((TreeObject) ((StructuredSelection) viewer
.getSelection()).getFirstElement()).getNode() instanceof IASTName) {
items[i].setVisible(true);
} else {
items[i].setVisible(false);
}
}
}
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null && private void contributeToActionBars() {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor() != null) IActionBars bars = getViewSite().getActionBars();
part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); fillLocalPullDown(bars.getMenuManager());
} fillLocalToolBar(bars.getToolBarManager());
}
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); private void fillLocalPullDown(IMenuManager manager) {
drillDownAdapter = new DrillDownAdapter(viewer); // manager.add(action1); // TODO determine the groups/filters to use
// manager.add(new Separator());
// manager.add(action2);
}
if (part instanceof CEditor) void fillContextMenu(IMenuManager manager) {
viewer.setContentProvider( new ViewContentProvider(((CEditor)part).getInputFile()) ); manager.add(action1);
else manager.add(action2);
viewer.setContentProvider(new ViewContentProvider(file)); manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
viewer.setLabelProvider(new ViewLabelProvider()); private void fillLocalToolBar(IToolBarManager manager) {
viewer.setInput(getViewSite()); manager.add(refreshAction);
makeActions(); manager.add(new Separator());
hookContextMenu(); drillDownAdapter.addNavigationActions(manager);
hookSingleClickAction(); }
contributeToActionBars();
}
public void setContentProvider(ViewContentProvider vcp) { private void makeActions() {
viewer.setContentProvider(vcp); refreshAction = new Action() {
} public void run() {
setContentProvider(new ViewContentProvider(file));
}
};
refreshAction.setText(REFRESH_DOM_AST);
refreshAction.setToolTipText(REFRESH_DOM_AST);
refreshAction.setImageDescriptor(DOMASTPluginImages.DESC_IASTInitializer);
private void hookContextMenu() { action1 = new Action() {
MenuManager menuMgr = new MenuManager(POPUPMENU); public void run() {
menuMgr.setRemoveAllWhenShown(true); showMessage("Action 1 executed"); // TODO open declarations action
menuMgr.addMenuListener(new IMenuListener() { // ... use annotations
public void menuAboutToShow(IMenuManager manager) { }
DOMAST.this.fillContextMenu(manager); };
IContributionItem[] items = manager.getItems(); action1.setText(OPEN_DECLARATIONS);
for (int i=0; i<items.length; i++) { action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
if (items[i] instanceof ActionContributionItem && .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
(((ActionContributionItem)items[i]).getAction().getText().equals(OPEN_REFERENCES) ||
((ActionContributionItem)items[i]).getAction().getText().equals(OPEN_DECLARATIONS) )) {
if (viewer.getSelection() instanceof StructuredSelection &&
((StructuredSelection)viewer.getSelection()).getFirstElement() instanceof TreeObject &&
((TreeObject)((StructuredSelection)viewer.getSelection()).getFirstElement()).getNode() instanceof IASTName) {
items[i].setVisible(true);
} else {
items[i].setVisible(false);
}
}
}
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void contributeToActionBars() { action2 = new Action() {
IActionBars bars = getViewSite().getActionBars(); public void run() {
fillLocalPullDown(bars.getMenuManager()); showMessage("Action 2 executed"); // TODO open references action ...
fillLocalToolBar(bars.getToolBarManager()); // use annotations
} }
};
action2.setText(OPEN_REFERENCES);
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
private void fillLocalPullDown(IMenuManager manager) { singleClickAction = new ASTHighlighterAction(part);
// manager.add(action1); // TODO determine the groups/filters to use }
// manager.add(new Separator());
// manager.add(action2);
}
private void fillContextMenu(IMenuManager manager) { private class ASTHighlighterAction extends Action {
manager.add(action1); IEditorPart aPart = null;
manager.add(action2);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) { public ASTHighlighterAction(IEditorPart part) {
manager.add(refreshAction); this.aPart = part;
manager.add(new Separator()); }
drillDownAdapter.addNavigationActions(manager);
}
private void makeActions() { public void setPart(IEditorPart part) {
refreshAction = new Action() { this.aPart = part;
public void run() { }
setContentProvider(new ViewContentProvider(file));
}
};
refreshAction.setText(REFRESH_DOM_AST);
refreshAction.setToolTipText(REFRESH_DOM_AST);
refreshAction.setImageDescriptor(DOMASTPluginImages.DESC_IASTInitializer);
action1 = new Action() { protected boolean open(String filename) throws PartInitException,
public void run() { CModelException {
showMessage("Action 1 executed"); // TODO open declarations action ... use annotations IPath path = new Path(filename);
} IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(
}; path);
action1.setText(OPEN_DECLARATIONS); if (f != null) {
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). EditorUtility.openInEditor(f);
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); return true;
}
action2 = new Action() { FileStorage storage = new FileStorage(null, path);
public void run() { EditorUtility.openInEditor(storage);
showMessage("Action 2 executed"); // TODO open references action ... use annotations return true;
} }
};
action2.setText(OPEN_REFERENCES);
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
singleClickAction = new ASTHighlighterAction(part); public void run() {
} ISelection selection = viewer.getSelection();
Object obj = ((IStructuredSelection) selection).getFirstElement();
if (aPart instanceof CEditor && obj instanceof TreeObject) {
String filename = ((TreeObject) obj).getFilename();
IResource r = ParserUtil.getResourceForFilename(filename);
if (r != null) {
try {
aPart = EditorUtility.openInEditor(r);
} catch (PartInitException pie) {
return;
} catch (CModelException e) {
return;
}
} else {
IPath path = new Path( filename );
FileStorage storage = new FileStorage(null, path);
try {
aPart = EditorUtility.openInEditor(storage);
} catch (PartInitException e) {
return;
} catch (CModelException e) {
return;
}
}
((CEditor) aPart).selectAndReveal(((TreeObject) obj).getOffset(),
((TreeObject) obj).getLength());
}
}
}
private class ASTHighlighterAction extends Action { // TODO need to create a new action with the following for annotations (get
IEditorPart aPart = null; // declarations/references)
// ISelection selection = viewer.getSelection();
// Object obj = ((IStructuredSelection)selection).getFirstElement();
//
// if (aPart instanceof CEditor) {
// IAnnotationModel aModel =
// ((CEditor)aPart).getDocumentProvider().getAnnotationModel(aPart.getEditorInput());
// if ( aModel != null && obj instanceof TreeObject &&
// !(((TreeObject)obj).getNode() instanceof IASTTranslationUnit) ) {
// Iterator itr = aModel.getAnnotationIterator();
// while (itr.hasNext()) {
// aModel.removeAnnotation((Annotation)itr.next());
// }
//
// ASTViewAnnotation annotation = new ASTViewAnnotation();
// annotation.setType(CMarkerAnnotation.WARNING_ANNOTATION_TYPE);
// aModel.addAnnotation(annotation, new
// Position(((TreeObject)obj).getOffset(), ((TreeObject)obj).getLength()));
// }
// }
public ASTHighlighterAction(IEditorPart part) { // TODO implement annotation for things like open declarations/references
this.aPart = part; // private class ASTViewAnnotation extends Annotation implements
} // IAnnotationPresentation {
//
// /* (non-Javadoc)
// * @see org.eclipse.jface.text.source.IAnnotationPresentation#getLayer()
// */
// public int getLayer() {
// return IAnnotationAccessExtension.DEFAULT_LAYER;
// }
//
// /* (non-Javadoc)
// * @see
// org.eclipse.jface.text.source.IAnnotationPresentation#paint(org.eclipse.swt.graphics.GC,
// org.eclipse.swt.widgets.Canvas, org.eclipse.swt.graphics.Rectangle)
// */
// public void paint(GC gc, Canvas canvas, Rectangle r) {
// // TODO implement this annotation image for
// ImageUtilities.drawImage(ASTViewPluginImages.get(ASTViewPluginImages.IMG_TO_DRAW),
// gc, canvas, r, SWT.CENTER, SWT.TOP);
// }
// }
public void setPart(IEditorPart part) { private void hookSingleClickAction() {
this.aPart = part; viewer.addSelectionChangedListener(new ISelectionChangedListener() {
} public void selectionChanged(SelectionChangedEvent event) {
// TODO Auto-generated method stub
singleClickAction.run();
}
});
}
public void run() { private void showMessage(String message) {
ISelection selection = viewer.getSelection(); MessageDialog.openInformation(viewer.getControl().getShell(), VIEW_NAME,
Object obj = ((IStructuredSelection)selection).getFirstElement(); message);
if (aPart instanceof CEditor && obj instanceof TreeObject) { }
((CEditor)aPart).selectAndReveal(((TreeObject)obj).getOffset(), ((TreeObject)obj).getLength());
}
}
}
// TODO need to create a new action with the following for annotations (get declarations/references) /**
// ISelection selection = viewer.getSelection(); * Passing the focus request to the viewer's control.
// Object obj = ((IStructuredSelection)selection).getFirstElement(); */
// public void setFocus() {
// if (aPart instanceof CEditor) { viewer.getControl().setFocus();
// IAnnotationModel aModel = ((CEditor)aPart).getDocumentProvider().getAnnotationModel(aPart.getEditorInput()); }
// if ( aModel != null && obj instanceof TreeObject && !(((TreeObject)obj).getNode() instanceof IASTTranslationUnit) ) {
// Iterator itr = aModel.getAnnotationIterator();
// while (itr.hasNext()) {
// aModel.removeAnnotation((Annotation)itr.next());
// }
//
// ASTViewAnnotation annotation = new ASTViewAnnotation();
// annotation.setType(CMarkerAnnotation.WARNING_ANNOTATION_TYPE);
// aModel.addAnnotation(annotation, new Position(((TreeObject)obj).getOffset(), ((TreeObject)obj).getLength()));
// }
// }
public void setFile(IFile file) {
this.file = file;
viewer.setContentProvider(new ViewContentProvider(file));
}
// TODO implement annotation for things like open declarations/references public void setPart(IEditorPart part) {
// private class ASTViewAnnotation extends Annotation implements IAnnotationPresentation { this.part = part;
//
// /* (non-Javadoc)
// * @see org.eclipse.jface.text.source.IAnnotationPresentation#getLayer()
// */
// public int getLayer() {
// return IAnnotationAccessExtension.DEFAULT_LAYER;
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.jface.text.source.IAnnotationPresentation#paint(org.eclipse.swt.graphics.GC, org.eclipse.swt.widgets.Canvas, org.eclipse.swt.graphics.Rectangle)
// */
// public void paint(GC gc, Canvas canvas, Rectangle r) {
// // TODO implement this annotation image for
// ImageUtilities.drawImage(ASTViewPluginImages.get(ASTViewPluginImages.IMG_TO_DRAW), gc, canvas, r, SWT.CENTER, SWT.TOP);
// }
// }
private void hookSingleClickAction() { if (singleClickAction instanceof ASTHighlighterAction)
viewer.addSelectionChangedListener(new ISelectionChangedListener() { ((ASTHighlighterAction) singleClickAction).setPart(part);
public void selectionChanged(SelectionChangedEvent event) { }
// TODO Auto-generated method stub
singleClickAction.run();
}
});
}
private void showMessage(String message) {
MessageDialog.openInformation(
viewer.getControl().getShell(),
VIEW_NAME,
message);
}
/** public void setLang(ParserLanguage lang) {
* Passing the focus request to the viewer's control. this.lang = lang;
*/ }
public void setFocus() {
viewer.getControl().setFocus();
}
public void setFile(IFile file) {
this.file = file;
viewer.setContentProvider(new ViewContentProvider(file));
}
public void setPart(IEditorPart part) {
this.part = part;
if (singleClickAction instanceof ASTHighlighterAction)
((ASTHighlighterAction)singleClickAction).setPart(part);
}
public void setLang(ParserLanguage lang) {
this.lang = lang;
}
} }

View file

@ -10,8 +10,10 @@
**********************************************************************/ **********************************************************************/
package org.eclipse.cdt.ui.tests.DOMAST; package org.eclipse.cdt.ui.tests.DOMAST;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
@ -57,6 +59,7 @@ public class TreeObject implements IAdaptable {
} }
public String toString() { public String toString() {
if( node == null ) return ""; //$NON-NLS-1$ //TODO Devin is this the best way???
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
Class[] classes = node.getClass().getInterfaces(); Class[] classes = node.getClass().getInterfaces();
@ -80,17 +83,25 @@ public class TreeObject implements IAdaptable {
return null; return null;
} }
public int getOffset() { public String getFilename()
if (node instanceof ASTNode) {
return ((ASTNode)node).getOffset(); IASTNodeLocation [] location = node.getNodeLocations();
if( location[0] instanceof IASTFileLocation )
return ((IASTFileLocation)location[0]).getFileName();
return ""; //$NON-NLS-1$
}
return 0; public int getOffset() {
IASTNodeLocation [] location = node.getNodeLocations();
if( location.length == 1 )
return location[0].getNodeOffset();
return 0;
} }
public int getLength() { public int getLength() {
if (node instanceof ASTNode) IASTNodeLocation [] location = node.getNodeLocations();
return ((ASTNode)node).getLength(); if( location.length == 1 )
return location[0].getNodeLength();
return 0; return 0;
} }
} }