/*******************************************************************************
* Copyright (c) 2008, 2009 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.ISourceCodeParser;
import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.GCCScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.ICParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.GPPScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.ICPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.POPCPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.POPCPPScannerExtensionConfiguration;
import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IncludeFileContentProvider;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
/**
* Testcases for non-gnu language extensions.
*/
public class LanguageExtensionsTest extends AST2BaseTest {
protected static final int SIZEOF_EXTENSION = 0x1;
protected static final int FUNCTION_STYLE_ASM = 0x2;
protected static final int SLASH_PERCENT_COMMENT = 0x4;
public static TestSuite suite() {
return suite(LanguageExtensionsTest.class);
}
public LanguageExtensionsTest() {
super();
}
public LanguageExtensionsTest(String name) {
super(name);
}
private IASTTranslationUnit parse(ISourceCodeParser parser) {
IASTTranslationUnit tu= parser.parse();
assertFalse(parser.encounteredError());
assertEquals(0, tu.getPreprocessorProblemsCount());
assertEquals(0, CPPVisitor.getProblems(tu).length);
return tu;
}
protected IASTTranslationUnit parse(String code, IScannerExtensionConfiguration sext,
ICPPParserExtensionConfiguration pext) throws Exception {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
IScanner scanner = new CPreprocessor(codeReader, new ScannerInfo(), ParserLanguage.CPP, NULL_LOG,
sext, IncludeFileContentProvider.getSavedFilesProvider());
GNUCPPSourceParser parser = new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, pext);
return parse(parser);
}
protected IASTTranslationUnit parse(String code, IScannerExtensionConfiguration sext,
ICParserExtensionConfiguration pext) throws Exception {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
IScanner scanner = new CPreprocessor(codeReader, new ScannerInfo(), ParserLanguage.C, NULL_LOG, sext,
IncludeFileContentProvider.getSavedFilesProvider());
GNUCSourceParser parser = new GNUCSourceParser(scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, pext);
return parse(parser);
}
protected IASTTranslationUnit parseCPPWithExtension(String code, final int extensions) throws Exception {
return parse(code,
new GPPScannerExtensionConfiguration() {
@Override
public boolean supportSlashPercentComments() {
return (extensions & SLASH_PERCENT_COMMENT) != 0;
}
},
new GPPParserExtensionConfiguration() {
@Override
public boolean supportExtendedSizeofOperator() {
return (extensions & SIZEOF_EXTENSION) != 0;
}
@Override
public boolean supportFunctionStyleAssembler() {
return (extensions & FUNCTION_STYLE_ASM) != 0;
}
}
);
}
protected IASTTranslationUnit parseCWithExtension(String code, final int extensions) throws Exception {
return parse(code,
new GCCScannerExtensionConfiguration() {
@Override
public boolean supportSlashPercentComments() {
return (extensions & SLASH_PERCENT_COMMENT) != 0;
}
},
new GCCParserExtensionConfiguration() {
@Override
public boolean supportExtendedSizeofOperator() {
return (extensions & SIZEOF_EXTENSION) != 0;
}
@Override
public boolean supportFunctionStyleAssembler() {
return (extensions & FUNCTION_STYLE_ASM) != 0;
}
}
);
}
// parclass ExampleClass {
// };
public void testPOP_parclass() throws Exception {
IASTTranslationUnit tu= parse(getAboveComment(),
POPCPPScannerExtensionConfiguration.getInstance(),
POPCPPParserExtensionConfiguration.getInstance()
);
ICPPASTCompositeTypeSpecifier comp= getCompositeType(tu, 0);
}
// parclass Table {
// void sort([in, out, size=n] int *data, int n);
// };
public void testPOP_marshallingData() throws Exception {
IASTTranslationUnit tu= parse(getAboveComment(),
POPCPPScannerExtensionConfiguration.getInstance(),
POPCPPParserExtensionConfiguration.getInstance()
);
ICPPASTCompositeTypeSpecifier comp= getCompositeType(tu, 0);
IASTSimpleDeclaration sd= getDeclaration(comp, 0);
assertInstance(sd.getDeclarators()[0], IASTFunctionDeclarator.class);
}
// parclass Bird {
// public:
// Bird(float P) @{ od.power(P);
// od.memory(100,60);
// od.protocol("socket http"); };
// };
public void testPOP_objectDescriptor() throws Exception {
IASTTranslationUnit tu= parse(getAboveComment(),
POPCPPScannerExtensionConfiguration.getInstance(),
POPCPPParserExtensionConfiguration.getInstance()
);
ICPPASTCompositeTypeSpecifier comp= getCompositeType(tu, 0);
IASTSimpleDeclaration sd= getDeclaration(comp, 1);
assertInstance(sd.getDeclarators()[0], IASTFunctionDeclarator.class);
}
// @pack(Stack, Queue, List)
// int a();
public void testPOP_packDirective() throws Exception {
IASTTranslationUnit tu= parse(getAboveComment(),
POPCPPScannerExtensionConfiguration.getInstance(),
POPCPPParserExtensionConfiguration.getInstance()
);
IASTSimpleDeclaration sd= getDeclaration(tu, 0);
assertInstance(sd.getDeclarators()[0], IASTFunctionDeclarator.class);
}
// void test() {
// sizeof(int, 1);
// sizeof(int, 2, 2);
// }
public void testSizeofExtension() throws Exception {
IASTTranslationUnit tu= parseCWithExtension(getAboveComment(), SIZEOF_EXTENSION);
IASTFunctionDefinition fdef= getDeclaration(tu, 0);
IASTUnaryExpression expr= getExpressionOfStatement(fdef, 0);
assertEquals(IASTUnaryExpression.op_sizeof, expr.getOperator());
assertInstance(expr.getOperand(), IASTExpressionList.class);
expr= getExpressionOfStatement(fdef, 1);
assertEquals(IASTUnaryExpression.op_sizeof, expr.getOperator());
assertInstance(expr.getOperand(), IASTExpressionList.class);
tu= parseCPPWithExtension(getAboveComment(), SIZEOF_EXTENSION);
fdef= getDeclaration(tu, 0);
expr= getExpressionOfStatement(fdef, 0);
assertEquals(IASTUnaryExpression.op_sizeof, expr.getOperator());
assertInstance(expr.getOperand(), IASTExpressionList.class);
expr= getExpressionOfStatement(fdef, 1);
assertEquals(IASTUnaryExpression.op_sizeof, expr.getOperator());
assertInstance(expr.getOperand(), IASTExpressionList.class);
}
// asm volatile int a1() {
// assembler code here
// }
// asm int a2() {
// assembler code here
// }
// asm volatile a3(int) {
// assembler code here
// }
// asm a4() {
// assembler code here
// }
public void testFunctionStyleAssembler() throws Exception {
IASTTranslationUnit tu= parseCWithExtension(getAboveComment(), FUNCTION_STYLE_ASM);
IASTFunctionDefinition fdef= getDeclaration(tu, 0);
fdef= getDeclaration(tu, 1);
fdef= getDeclaration(tu, 2);
fdef= getDeclaration(tu, 3);
tu= parseCPPWithExtension(getAboveComment(), FUNCTION_STYLE_ASM);
fdef= getDeclaration(tu, 0);
fdef= getDeclaration(tu, 1);
fdef= getDeclaration(tu, 2);
fdef= getDeclaration(tu, 3);
}
// /% a comment %/
// int a;
public void testSlashPercentComment() throws Exception {
IASTTranslationUnit tu= parseCWithExtension(getAboveComment(), SLASH_PERCENT_COMMENT);
IASTDeclaration d= getDeclaration(tu, 0);
assertEquals("int a;", d.getRawSignature());
}
}