Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-dev] adding a new language to the CDT


Hi,
I'm working on an Eclipse Plug-In to support a procedural programming language called PL8, a PL/I variant for systems programming. We have PL8 and C source files in one source tree (project). Our compiler builds all files to object files and then they are linked together to one binary. It is possible to call a C-function from a PL8-function and vice versa. So our idea was to use the CDT and treat the source tree as a C/C++ project. The C/C++ files will be handled by CDT and the PL8 files are handled by a PL8 editor (Syntax highlighting, outline view). We also want to use the code navigation feature in the PL8 context. Therefore our idea was to add some informations like function definitions in the C-index. We created a Java class PL8Language implementing the ILanguage interface from the ILanguage Extension Point of the CDT. The parser of the PL8 should not create an own index, but should add the functions of PL8 language to the index, created by the CDT-Parser.
If I click e.g. on a PL8-function in a C-file, the C-indexer searches for the function in the now combined index for the location of the function and jumps to it. If I click in a PL8-file, my own indexer searchs for the function in the combined index.

I think the solution is to implement the getASTTranslationUnit and my own ModelBuilder.
I tried to implement the getASTTranslationUnit in this way.

public IASTTranslationUnit getASTTranslationUnit(CodeReader reader,
                        IScannerInfo scanInfo, ICodeReaderFactory fileCreator,
                        IIndex index, IParserLogService log) throws CoreException {
                System.out.println("PL8Language::getASTTranslationUnit");
                final ISourceCodeParser parser= new PL8SourceCodeParser(index);
                // Parse
                IASTTranslationUnit ast= parser.parse();
                return ast;
               
        }

The parse function of my SourceCodeParser looks like the following:

public IASTTranslationUnit parse() {
                System.out.println("PL8SourceCodeParser::parse");
                IASTTranslationUnit result;
                //Create a new TranslationUnit
                translationUnit = new CASTTranslationUnit();
                translationUnit.setOffset(0);
                translationUnit.setIndex(index);
               
                //Name of the function
                char name_str[] = {'A', 'B'};
                CASTName declaratorName = new CASTName(name_str);
       
                //new SimpleDeclaration
                IASTSimpleDeclaration declaration = new CASTSimpleDeclaration();
               
                IASTStandardFunctionDeclarator declarator = new CASTFunctionDeclarator(declaratorName);
                declaration.addDeclarator(declarator);
               
                CASTSimpleDeclSpecifier declSpec = new CASTSimpleDeclSpecifier();
                declaration.setDeclSpecifier(declSpec);
               
                translationUnit.addDeclaration(declaration);
       
                result = translationUnit;
                translationUnit = null;
               
                return result;
        }

The goal is to add a function AB to the index. But the current situation is different. There is no function with the name AB in the index and at the moment I had no idea what the reason is. The return value of the parse function is the right one. The return value has the function included.
At the moment I found no other way to write into the index, which is used for the source code navigation.

I also searched for a solution in the CDT Wiki in the topic Design. It is clearly explained about the CDT works, but no explanation how I can implement my idea.

So my question to you, where is my mistake or is it generally possible to implement my idea?
Is there anything additional I have to do or can you point me to an example ?

Thank you in advance!

Kind regards

Michael

Back to the top