use of org.eclipse.cdt.core.dom.ast.IASTNodeSelector in project linuxtools by eclipse.
the class CParser method parseCurrentFunction.
@Override
public String parseCurrentFunction(IEditorInput input, int offset) throws CoreException {
String currentElementName;
if (input instanceof IFileEditorInput) {
// Get the working copy and connect to input.
IWorkingCopyManager manager = CUIPlugin.getDefault().getWorkingCopyManager();
manager.connect(input);
// Retrieve the C/C++ Element in question.
IWorkingCopy workingCopy = manager.getWorkingCopy(input);
ICElement method = workingCopy.getElementAtOffset(offset);
manager.disconnect(input);
// no element selected
if (method == null)
return "";
// Get the current element name, to test it.
currentElementName = method.getElementName();
// Element doesn't have a name. Can go no further.
if (currentElementName == null) {
// element doesn't have a name
return "";
}
// Get the Element Type to test.
int elementType = method.getElementType();
switch(elementType) {
case ICElement.C_FIELD:
case ICElement.C_METHOD:
case ICElement.C_FUNCTION:
break;
case ICElement.C_MODEL:
return "";
// So it's not a method, field, function, or model. Where are we?
default:
ICElement tmpMethodType;
if (((tmpMethodType = method.getAncestor(ICElement.C_FUNCTION)) == null) && ((tmpMethodType = method.getAncestor(ICElement.C_METHOD)) == null) && ((tmpMethodType = method.getAncestor(ICElement.C_CLASS)) == null)) {
return "";
} else {
// In a class, but not in a method. Return class name instead.
method = tmpMethodType;
currentElementName = method.getElementName();
}
}
// Build all ancestor classes.
// Append all ancestor class names to string
ICElement tmpParent = method.getParent();
while (tmpParent != null) {
ICElement tmpParentClass = tmpParent.getAncestor(ICElement.C_CLASS);
if (tmpParentClass != null) {
String tmpParentClassName = tmpParentClass.getElementName();
if (tmpParentClassName == null)
return currentElementName;
currentElementName = tmpParentClassName + "." + currentElementName;
} else
return currentElementName;
tmpParent = tmpParentClass.getParent();
}
return currentElementName;
} else if (input instanceof IStorageEditorInput) {
// Get the working copy and connect to input.
// don't follow inclusions
currentElementName = "";
IStorageEditorInput sei = (IStorageEditorInput) input;
// don't follow inclusions
IncludeFileContentProvider contentProvider = IncludeFileContentProvider.getEmptyFilesProvider();
// empty scanner info
IScannerInfo scanInfo = new ScannerInfo();
IStorage ancestorStorage = sei.getStorage();
if (ancestorStorage == null)
return "";
InputStream stream = ancestorStorage.getContents();
byte[] buffer = new byte[100];
String data = "";
int read = 0;
try {
do {
read = stream.read(buffer);
if (read > 0) {
String tmp = new String(buffer, 0, read);
data = data.concat(tmp);
}
} while (read == 100);
stream.close();
} catch (IOException e) {
// do nothing
}
// $NON-NLS-1$
FileContent content = FileContent.create("<text>", data.toCharArray());
// determine the language
ILanguage language = GPPLanguage.getDefault();
try {
IASTTranslationUnit ast;
int options = 0;
ast = language.getASTTranslationUnit(content, scanInfo, contentProvider, null, options, ParserUtil.getParserLogService());
IASTNodeSelector n = ast.getNodeSelector(null);
IASTNode node = n.findFirstContainedNode(offset, 100);
while (node != null && !(node instanceof IASTTranslationUnit)) {
if (node instanceof IASTFunctionDefinition) {
IASTFunctionDefinition fd = (IASTFunctionDefinition) node;
IASTFunctionDeclarator d = fd.getDeclarator();
currentElementName = new String(d.getName().getSimpleID());
break;
}
node = node.getParent();
}
} catch (CoreException exc) {
currentElementName = "";
CUIPlugin.log(exc);
}
return currentElementName;
}
return "";
}
use of org.eclipse.cdt.core.dom.ast.IASTNodeSelector in project linuxtools by eclipse.
the class AbstractValgrindMarkerResolution method getIASTNode.
/**
* Returns the enclosed AST node in the given marker.
* @param marker The {@link IMarker} containing the {@link IASTNode}
* @param document - document which is used to calculate offset
* @return the enclosed {@link IASTNode}
*/
protected IASTNode getIASTNode(IMarker marker, IDocument document) {
int offset = this.getOffset(marker, document);
int length = this.getLength(marker, document);
IASTNode node = null;
IASTTranslationUnit ast = getASTTranslationUnit(marker);
IASTNodeSelector nodeSelector = ast.getNodeSelector(marker.getResource().getLocationURI().getPath());
node = nodeSelector.findFirstContainedNode(offset, length);
return node;
}
use of org.eclipse.cdt.core.dom.ast.IASTNodeSelector in project ch.hsr.ifs.cdttesting by IFS-HSR.
the class ASTView method createPartControl.
@Override
public void createPartControl(final Composite parent) {
final ASTWidget treeView = new ASTWidget(parent);
getViewSite().getActionBars().getToolBarManager().add(new Action() {
@Override
public void run() {
treeView.drawAST(getAST());
}
@Override
public ImageDescriptor getImageDescriptor() {
final Bundle bundle = FrameworkUtil.getBundle(this.getClass());
final URL url = FileLocator.find(bundle, new Path("icons/refresh.gif"), null);
return ImageDescriptor.createFromURL(url);
}
@Override
public String getText() {
return "refresh";
}
});
treeView.drawAST(getAST());
treeView.setListener(new NodeSelectionListener() {
@Override
public void nodeSelected(final IASTNode node) {
final Map<String, Object> map = new HashMap<>();
map.put(PastaEventConstants.ASTNODE, node);
doPostEvent(PastaEventConstants.ASTNODE, map);
}
});
registerEventHandler(PastaEventConstants.SHOW_SELECTION, new EventHandler() {
@Override
public void handleEvent(final Event event) {
final ISelection selection = (ISelection) event.getProperty(PastaEventConstants.SELECTION);
if (selection instanceof ITextSelection) {
treeView.drawAST(getAST());
final IASTNodeSelector selector = getAST().getNodeSelector(getAST().getFilePath());
treeView.showSelectedNode(selector.findEnclosingNode(((ITextSelection) selection).getOffset(), ((ITextSelection) selection).getLength()));
}
}
});
}
Aggregations