/*******************************************************************************
* Copyright (c) 2005, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.CDOM;
import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.parser.ISourceCodeParser;
import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.ICParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.ICPPParserExtensionConfiguration;
import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IParserLogService;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.NullLogService;
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.core.parser.tests.FileBasePluginTest;
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
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.ParserException;
import org.eclipse.core.resources.IFile;
/**
* @author dsteffle
*/
public class AST2SelectionParseBaseTest extends FileBasePluginTest {
public AST2SelectionParseBaseTest() {
}
public AST2SelectionParseBaseTest(String name) {
super(name);
}
private static final IParserLogService NULL_LOG = new NullLogService();
public AST2SelectionParseBaseTest(String name, Class className) {
super(name, className);
}
protected IASTNode parse(String code, ParserLanguage lang, int offset, int length) throws ParserException {
return parse(code, lang, false, false, offset, length);
}
protected IASTNode parse(IFile file, ParserLanguage lang, int offset, int length) throws ParserException {
IASTTranslationUnit tu = parse(file, lang, false, false);
return tu.getNodeSelector(null).findNode(offset, length);
}
protected IASTNode parse(String code, ParserLanguage lang, int offset, int length, boolean expectedToPass) throws ParserException {
return parse(code, lang, false, expectedToPass, offset, length);
}
protected IASTNode parse(String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems, int offset, int length) throws ParserException {
IASTTranslationUnit tu = parse(code, lang, useGNUExtensions, expectNoProblems);
return tu.getNodeSelector(null).findNode(offset, length);
}
/**
* @param string
* @param c
* @return
* @throws ParserException
*/
protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems ) throws ParserException {
FileContent codeReader = FileContent.create("<test-code>", code.toCharArray());
ScannerInfo scannerInfo = new ScannerInfo();
IScanner scanner= AST2BaseTest.createScanner(codeReader, lang, ParserMode.COMPLETE_PARSE, scannerInfo);
ISourceCodeParser parser2 = null;
if( lang == ParserLanguage.CPP )
{
ICPPParserExtensionConfiguration config = null;
if (useGNUExtensions)
config = new GPPParserExtensionConfiguration();
else
config = new ANSICPPParserExtensionConfiguration();
parser2 = new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE,
NULL_LOG,
config );
}
else
{
ICParserExtensionConfiguration config = null;
if (useGNUExtensions)
config = new GCCParserExtensionConfiguration();
else
config = new ANSICParserExtensionConfiguration();
parser2 = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE,
NULL_LOG, config );
}
IASTTranslationUnit tu = parser2.parse();
if( parser2.encounteredError() && expectNoProblems )
throw new ParserException( "FAILURE"); //$NON-NLS-1$
if( lang == ParserLanguage.C && expectNoProblems )
{
assertEquals( CVisitor.getProblems(tu).length, 0 );
assertEquals( tu.getPreprocessorProblems().length, 0 );
}
else if ( lang == ParserLanguage.CPP && expectNoProblems )
{
assertEquals( CPPVisitor.getProblems(tu).length, 0 );
assertEquals( tu.getPreprocessorProblems().length, 0 );
}
if( expectNoProblems )
assertEquals( 0, tu.getPreprocessorProblems().length );
return tu;
}
protected IASTTranslationUnit parse( IFile file, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems ) throws ParserException {
IASTTranslationUnit tu=null;
try {
tu = CDOM.getInstance().getASTService().getTranslationUnit(file);
} catch (UnsupportedDialectException e) {
assertFalse(true); // shouldn't happen
}
if( lang == ParserLanguage.C && expectNoProblems )
{
assertEquals( CVisitor.getProblems(tu).length, 0 );
assertEquals( tu.getPreprocessorProblems().length, 0 );
}
else if ( lang == ParserLanguage.CPP && expectNoProblems )
{
assertEquals( CPPVisitor.getProblems(tu).length, 0 );
assertEquals( tu.getPreprocessorProblems().length, 0 );
}
if( expectNoProblems )
assertEquals( 0, tu.getPreprocessorProblems().length );
return tu;
}
}