Search in sources :

Example 1 with IScannerInfo

use of org.eclipse.cdt.core.parser.IScannerInfo 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 "";
}
Also used : IScannerInfo(org.eclipse.cdt.core.parser.IScannerInfo) ScannerInfo(org.eclipse.cdt.core.parser.ScannerInfo) IncludeFileContentProvider(org.eclipse.cdt.core.parser.IncludeFileContentProvider) IWorkingCopy(org.eclipse.cdt.core.model.IWorkingCopy) IStorageEditorInput(org.eclipse.ui.IStorageEditorInput) IASTFunctionDeclarator(org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator) InputStream(java.io.InputStream) IASTNode(org.eclipse.cdt.core.dom.ast.IASTNode) IOException(java.io.IOException) ICElement(org.eclipse.cdt.core.model.ICElement) IStorage(org.eclipse.core.resources.IStorage) IASTFunctionDefinition(org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition) FileContent(org.eclipse.cdt.core.parser.FileContent) ILanguage(org.eclipse.cdt.core.model.ILanguage) IASTNodeSelector(org.eclipse.cdt.core.dom.ast.IASTNodeSelector) CoreException(org.eclipse.core.runtime.CoreException) IFileEditorInput(org.eclipse.ui.IFileEditorInput) IASTTranslationUnit(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit) IScannerInfo(org.eclipse.cdt.core.parser.IScannerInfo) IWorkingCopyManager(org.eclipse.cdt.ui.IWorkingCopyManager)

Aggregations

IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 IASTFunctionDeclarator (org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator)1 IASTFunctionDefinition (org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition)1 IASTNode (org.eclipse.cdt.core.dom.ast.IASTNode)1 IASTNodeSelector (org.eclipse.cdt.core.dom.ast.IASTNodeSelector)1 IASTTranslationUnit (org.eclipse.cdt.core.dom.ast.IASTTranslationUnit)1 ICElement (org.eclipse.cdt.core.model.ICElement)1 ILanguage (org.eclipse.cdt.core.model.ILanguage)1 IWorkingCopy (org.eclipse.cdt.core.model.IWorkingCopy)1 FileContent (org.eclipse.cdt.core.parser.FileContent)1 IScannerInfo (org.eclipse.cdt.core.parser.IScannerInfo)1 IncludeFileContentProvider (org.eclipse.cdt.core.parser.IncludeFileContentProvider)1 ScannerInfo (org.eclipse.cdt.core.parser.ScannerInfo)1 IWorkingCopyManager (org.eclipse.cdt.ui.IWorkingCopyManager)1 IStorage (org.eclipse.core.resources.IStorage)1 CoreException (org.eclipse.core.runtime.CoreException)1 IFileEditorInput (org.eclipse.ui.IFileEditorInput)1 IStorageEditorInput (org.eclipse.ui.IStorageEditorInput)1