blob: c533a173631b562bdb02b8671a688b37bf827ba0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2013 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Rational Software - initial implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.model.ASTStringUtil;
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator;
/**
* @author dsteffle
*/
public class AST2UtilTests extends AST2TestBase {
public AST2UtilTests() {
}
public AST2UtilTests(String name) {
super(name);
}
public void testSimpleSignature() throws Exception {
StringBuilder buff = new StringBuilder();
buff.append("int l, m, n=0;\n"); //$NON-NLS-1$
buff.append("int j = l ? m : n;\n"); //$NON-NLS-1$
buff.append("int i = l^m;\n"); //$NON-NLS-1$
buff.append("int g = i<<=j;\n"); //$NON-NLS-1$
buff.append("int f = sizeof( int );\n"); //$NON-NLS-1$
buff.append("int e = ~f;\n"); //$NON-NLS-1$
buff.append("int d = ++e;\n"); //$NON-NLS-1$
buff.append("int b = d++;\n"); //$NON-NLS-1$
buff.append("int c = sizeof b;\n"); //$NON-NLS-1$
buff.append("int a = b + c;\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C);
IASTDeclaration[] d = tu.getDeclarations();
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[0]).getDeclarators()[2].getInitializer())
.getInitializerClause(),
"0"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[1]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"l ? m : n"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[2]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"l ^ m"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[3]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"i <<= j"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[4]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"sizeof(int)"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[5]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"~f"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[6]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"++e"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[7]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"d++"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[8]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"sizeof b"); //$NON-NLS-1$
isExpressionStringEqual(
((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[9]).getDeclarators()[0].getInitializer())
.getInitializerClause(),
"b + c"); //$NON-NLS-1$
}
public void testSimpleParameter() throws Exception {
StringBuilder buff = new StringBuilder();
buff.append("int a(int x);\n"); //$NON-NLS-1$
buff.append("int * b(char y, int x);\n"); //$NON-NLS-1$
buff.append("void c(int * z, float **b);\n"); //$NON-NLS-1$
buff.append("static int d(int a[restrict]);\n"); //$NON-NLS-1$
buff.append("void e(const char* const);\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C);
IASTDeclaration[] d = tu.getDeclarations();
isParameterSignatureEqual(((IASTSimpleDeclaration) d[0]).getDeclarators()[0], "(int)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[1]).getDeclarators()[0], "(char, int)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[2]).getDeclarators()[0], "(int*, float**)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[3]).getDeclarators()[0], "(int[])"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[4]).getDeclarators()[0], "(const char* const)"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[0]).getDeclarators()[0], "int(int)"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[1]).getDeclarators()[0], "int*(char, int)"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[2]).getDeclarators()[0], "void(int*, float**)"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[3]).getDeclarators()[0], "int(int[])"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[4]).getDeclarators()[0], "void(const char* const)"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[0]).getDeclSpecifier(), "int"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[1]).getDeclSpecifier(), "int"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[2]).getDeclSpecifier(), "void"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[3]).getDeclSpecifier(), "int"); //$NON-NLS-1$
isSignatureEqual(((IASTSimpleDeclaration) d[4]).getDeclSpecifier(), "void"); //$NON-NLS-1$
isTypeEqual(((IASTSimpleDeclaration) d[0]).getDeclarators()[0], "int (int)"); //$NON-NLS-1$
isTypeEqual(((IASTSimpleDeclaration) d[1]).getDeclarators()[0], "int * (char, int)"); //$NON-NLS-1$
isTypeEqual(((IASTSimpleDeclaration) d[2]).getDeclarators()[0], "void (int *, float * *)"); //$NON-NLS-1$
isTypeEqual(((IASTSimpleDeclaration) d[3]).getDeclarators()[0], "int (int * restrict)"); //$NON-NLS-1$
isTypeEqual(((IASTSimpleDeclaration) d[4]).getDeclarators()[0], "void (const char * const)"); //$NON-NLS-1$
isTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[0]).getDeclarators()[0].getName().resolveBinding()).getType(),
"int (int)"); //$NON-NLS-1$
isTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[1]).getDeclarators()[0].getName().resolveBinding()).getType(),
"int * (char, int)"); //$NON-NLS-1$
isTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[2]).getDeclarators()[0].getName().resolveBinding()).getType(),
"void (int *, float * *)"); //$NON-NLS-1$
isTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[3]).getDeclarators()[0].getName().resolveBinding()).getType(),
"int (int * restrict)"); //$NON-NLS-1$
isTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[4]).getDeclarators()[0].getName().resolveBinding()).getType(),
"void (const char * const)"); //$NON-NLS-1$
isParameterTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[0]).getDeclarators()[0].getName().resolveBinding()).getType(),
"(int)"); //$NON-NLS-1$
isParameterTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[1]).getDeclarators()[0].getName().resolveBinding()).getType(),
"(char, int)"); //$NON-NLS-1$
isParameterTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[2]).getDeclarators()[0].getName().resolveBinding()).getType(),
"(int *, float * *)"); //$NON-NLS-1$
isParameterTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[3]).getDeclarators()[0].getName().resolveBinding()).getType(),
"(int * restrict)"); //$NON-NLS-1$
isParameterTypeEqual(
((IFunction) ((IASTSimpleDeclaration) d[4]).getDeclarators()[0].getName().resolveBinding()).getType(),
"(const char * const)"); //$NON-NLS-1$
}
public void testSimpleCParameterSignature() throws Exception {
StringBuilder buff = new StringBuilder();
buff.append("int a(int x);\n"); //$NON-NLS-1$
buff.append("int * b(char y, int x);\n"); //$NON-NLS-1$
buff.append("void c(int * z, float **b);\n"); //$NON-NLS-1$
buff.append("static int d(int a[restrict]);\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C);
IASTDeclaration[] d = tu.getDeclarations();
isParameterSignatureEqual(((IASTSimpleDeclaration) d[0]).getDeclarators()[0], "(int)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[1]).getDeclarators()[0], "(char, int)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[2]).getDeclarators()[0], "(int*, float**)"); //$NON-NLS-1$
isParameterSignatureEqual(((IASTSimpleDeclaration) d[3]).getDeclarators()[0], "(int[])"); //$NON-NLS-1$
}
public void testSimpleTypeId() throws Exception {
StringBuilder buff = new StringBuilder();
buff.append("int x = sizeof( int );\n"); //$NON-NLS-1$
buff.append("union Squaw { int x; double u; };\n"); //$NON-NLS-1$
buff.append("int main(int argc, char **argv) {\n"); //$NON-NLS-1$
buff.append("return sizeof( union Squaw );\n}\n"); //$NON-NLS-1$
buff.append("typedef short Z; typedef Z jc;\n"); //$NON-NLS-1$
buff.append("int y = 4;\n"); //$NON-NLS-1$
buff.append("jc myJc = (jc)y;\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C);
IASTDeclaration[] d = tu.getDeclarations();
// verify signatures
isSignatureEqual(
((IASTTypeIdExpression) ((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[0]).getDeclarators()[0]
.getInitializer()).getInitializerClause()).getTypeId(),
"int"); //$NON-NLS-1$
isSignatureEqual(
((IASTTypeIdExpression) ((IASTReturnStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) d[2])
.getBody()).getStatements()[0]).getReturnValue()).getTypeId(),
"union Squaw"); //$NON-NLS-1$
isSignatureEqual(
((IASTCastExpression) ((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[6]).getDeclarators()[0]
.getInitializer()).getInitializerClause()).getTypeId(),
"jc"); //$NON-NLS-1$
// verify types
isTypeEqual(((IASTTypeIdExpression) ((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[0]).getDeclarators()[0]
.getInitializer()).getInitializerClause()).getTypeId(), "int"); //$NON-NLS-1$
isTypeEqual(
((IASTTypeIdExpression) ((IASTReturnStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) d[2])
.getBody()).getStatements()[0]).getReturnValue()).getTypeId(),
"Squaw"); //$NON-NLS-1$
isTypeEqual(((IASTCastExpression) ((IASTEqualsInitializer) ((IASTSimpleDeclaration) d[6]).getDeclarators()[0]
.getInitializer()).getInitializerClause()).getTypeId(), "short int"); //$NON-NLS-1$
}
public void testKnRC() throws Exception {
StringBuilder buff = new StringBuilder();
buff.append("int foo(x, y) char x; int y; {}\n"); //$NON-NLS-1$
buff.append("int foo2(char x, int y) {}\n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buff.toString(), ParserLanguage.C, true);
IASTDeclaration[] d = tu.getDeclarations();
String fooSignature = ASTStringUtil.getSignatureString(((IASTFunctionDefinition) d[0]).getDeclarator());
String foo2Signature = ASTStringUtil.getSignatureString(((IASTFunctionDefinition) d[1]).getDeclarator());
assertEquals(fooSignature, foo2Signature);
}
public void testParseIntegral() throws Exception {
assertEquals(0, ExpressionEvaluator.getNumber("0".toCharArray()));
assertEquals(0, ExpressionEvaluator.getNumber("0x0".toCharArray()));
assertEquals(0, ExpressionEvaluator.getNumber("00".toCharArray()));
assertEquals(0, ExpressionEvaluator.getNumber("000".toCharArray()));
assertEquals(0, ExpressionEvaluator.getNumber("0L".toCharArray()));
assertEquals(0, ExpressionEvaluator.getNumber("0LL".toCharArray()));
assertEquals(1, ExpressionEvaluator.getNumber("1".toCharArray()));
assertEquals(1, ExpressionEvaluator.getNumber("01".toCharArray()));
assertEquals(1, ExpressionEvaluator.getNumber("0x1".toCharArray()));
assertEquals(10, ExpressionEvaluator.getNumber("10".toCharArray()));
assertEquals(8, ExpressionEvaluator.getNumber("010".toCharArray()));
assertEquals(16, ExpressionEvaluator.getNumber("0x10".toCharArray()));
assertEquals(10, ExpressionEvaluator.getNumber("10LLL".toCharArray()));
assertEquals(8, ExpressionEvaluator.getNumber("010LLL".toCharArray()));
assertEquals(16, ExpressionEvaluator.getNumber("0x10LLL".toCharArray()));
}
}