1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fixed 81887 [Parser2] if () {...} else if () ... else {...} parsed incorrectly

Started DOMScannerTests.
This commit is contained in:
John Camelon 2005-01-06 20:52:07 +00:00
parent 35a922fdfd
commit d019346a04
9 changed files with 97 additions and 151 deletions

View file

@ -79,6 +79,7 @@ public class AST2BaseTest extends TestCase {
else else
configuration = new GPPScannerConfiguration(); configuration = new GPPScannerConfiguration();
IScanner scanner = new DOMScanner( codeReader, scannerInfo, ParserMode.COMPLETE_PARSE, lang, NULL_LOG, configuration, SavedCodeReaderFactory.getInstance() ); IScanner scanner = new DOMScanner( codeReader, scannerInfo, ParserMode.COMPLETE_PARSE, lang, NULL_LOG, configuration, SavedCodeReaderFactory.getInstance() );
ISourceCodeParser parser2 = null; ISourceCodeParser parser2 = null;
if( lang == ParserLanguage.CPP ) if( lang == ParserLanguage.CPP )
{ {
@ -96,12 +97,15 @@ public class AST2BaseTest extends TestCase {
parser2 = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE, parser2 = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE,
NULL_LOG, config ); NULL_LOG, config );
} }
IASTTranslationUnit tu = parser2.parse(); IASTTranslationUnit tu = parser2.parse();
if( parser2.encounteredError() ) if( parser2.encounteredError() )
throw new ParserException( "FAILURE"); //$NON-NLS-1$ throw new ParserException( "FAILURE"); //$NON-NLS-1$
//TODO add in assertion here to visit all problems //TODO add in assertion here to visit all problems
return tu; return tu;
} }

View file

@ -0,0 +1,30 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.parser.ParserException;
/**
* @author jcamelon
*/
public class DOMScannerTests extends AST2BaseTest {
public void testSimpleLocation() throws ParserException {
IASTTranslationUnit tu = parse( "int x;", ParserLanguage.C ); //$NON-NLS-1$
assertEquals( tu.getDeclarations()[0].getNodeLocations().length, 1 );
}
}

View file

@ -1,121 +0,0 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import java.util.Hashtable;
import java.util.Map;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ScannerInfo;
/**
* @author Doug Schaefer
*/
public class ScannerConfigFactory {
public static IScannerInfo getScannerInfo() {
String config = System.getProperty("speedTest.config");
if (config == null)
return mingwScannerInfo();
if (config.equals("msvc"))
return msvcScannerInfo();
else if (config.equals("ydl"))
return ydlScannerInfo();
else
return mingwScannerInfo();
}
private static IScannerInfo msvcScannerInfo() {
Map definitions = new Hashtable();
//definitions.put( "__GNUC__", "3" ); //$NON-NLS-1$ //$NON-NLS-2$
String [] includePaths = new String[] {
"C:\\Program Files\\Microsoft SDK\\Include",
"C:\\Program Files\\Microsoft Visual C++ Toolkit 2003\\include"
};
return new ScannerInfo( definitions, includePaths );
}
private static IScannerInfo mingwScannerInfo() {
// TODO It would be easier and more flexible if we used discovery for this
Map definitions = new Hashtable();
definitions.put("__GNUC__", "3");
definitions.put("__GNUC_MINOR__", "2");
definitions.put("__GNUC_PATCHLEVEL__", "3");
definitions.put("__GXX_ABI_VERSION", "102");
definitions.put("_WIN32", "");
definitions.put("__WIN32", "");
definitions.put("__WIN32__", "");
definitions.put("WIN32", "");
definitions.put("__MINGW32__", "");
definitions.put("__MSVCRT__", "");
definitions.put("WINNT", "");
definitions.put("_X86_", "1");
definitions.put("__WINNT", "");
definitions.put("_NO_INLINE__", "");
definitions.put("__STDC_HOSTED__", "1");
definitions.put("i386", "");
definitions.put("__i386", "");
definitions.put("__i386__", "");
definitions.put("__tune_i586__", "");
definitions.put("__tune_pentium__", "");
definitions.put("__stdcall", "__attribute__((__stdcall__))");
definitions.put("__cdecl", "__attribute__((__cdecl__))");
definitions.put("__fastcall", "__attribute__((__fastcall__))");
definitions.put("_stdcall", "__attribute__((__stdcall__))");
definitions.put("_cdecl", "__attribute__((__cdecl__))");
definitions.put("_fastcall", "__attribute__((__fastcall__))");
definitions.put("__declspec(x)", "__attribute__((x))");
definitions.put("__DEPRECATED", "");
definitions.put("__EXCEPTIONS", "");
String [] includePaths = new String[] {
"c:/mingw/include/c++/3.2.3",
"c:/mingw/include/c++/3.2.3/mingw32",
"c:/mingw/include/c++/3.2.3/backward",
"c:/mingw/include",
"c:/mingw/lib/gcc-lib/mingw32/3.2.3/include"
};
return new ScannerInfo( definitions, includePaths );
}
private static IScannerInfo ydlScannerInfo() {
// TODO It would be easier and more flexible if we used discovery for this
Map definitions = new Hashtable();
definitions.put("__GNUC__", "3");
definitions.put("__GNUC_MINOR__", "3");
definitions.put("__GNUC_PATCHLEVEL__", "3");
definitions.put("_GNU_SOURCE", "");
definitions.put("__unix__", "");
definitions.put("__gnu_linux__", "");
definitions.put("__linux__", "");
definitions.put("unix", "");
definitions.put("__unix", "");
definitions.put("linux", "");
definitions.put("__linux", "");
definitions.put("__GNUG__", "3");
String [] includePaths = new String[] {
"/usr/include/g++",
"/usr/include/g++/powerpc-yellowdog-linux",
"/usr/include/g++/backward",
"/usr/local/include",
"/usr/lib/gcc-lib/powerpc-yellowdog-linux/3.3.3/include",
"/usr/include"
};
return new ScannerInfo( definitions, includePaths );
}
}

View file

@ -18,10 +18,16 @@ import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
@ -922,26 +928,26 @@ public class CompleteParser2Tests extends TestCase {
public void testSimpleIfStatement() throws Exception public void testSimpleIfStatement() throws Exception
{ {
/*IASTTranslationUnit tu =*/ parse( "const bool T = true; int foo() { if( T ) { return 5; } else if( ! T ) return 20; else { return 10; } }"); //$NON-NLS-1$ IASTTranslationUnit tu =parse( "const bool T = true; int foo() { if( T ) { return 5; } else if( ! T ) return 20; else { return 10; } }"); //$NON-NLS-1$
// IASTFunctionDefinition foo = (IASTFunctionDefinition) tu.getDeclarations()[1]; IASTFunctionDefinition foo = (IASTFunctionDefinition) tu.getDeclarations()[1];
// IASTCompoundStatement compound = (IASTCompoundStatement) foo.getBody(); IASTCompoundStatement compound = (IASTCompoundStatement) foo.getBody();
// IASTIfStatement ifstmt = (IASTIfStatement) compound.getStatements()[0]; IASTIfStatement ifstmt = (IASTIfStatement) compound.getStatements()[0];
// assertTrue( ifstmt.getCondition() instanceof IASTIdExpression ); assertTrue( ifstmt.getCondition() instanceof IASTIdExpression );
// assertTrue( ifstmt.getThenClause() instanceof IASTCompoundStatement ); assertTrue( ifstmt.getThenClause() instanceof IASTCompoundStatement );
// assertTrue( ifstmt.getElseClause() instanceof IASTIfStatement ); assertTrue( ifstmt.getElseClause() instanceof IASTIfStatement );
// ifstmt = (IASTIfStatement) ifstmt.getElseClause(); ifstmt = (IASTIfStatement) ifstmt.getElseClause();
// assertTrue( ifstmt.getCondition() instanceof IASTUnaryExpression ); assertTrue( ifstmt.getCondition() instanceof IASTUnaryExpression );
// assertTrue( ifstmt.getThenClause() instanceof IASTReturnStatement ); assertTrue( ifstmt.getThenClause() instanceof IASTReturnStatement );
// assertTrue( ifstmt.getElseClause() instanceof IASTCompoundStatement ); assertTrue( ifstmt.getElseClause() instanceof IASTCompoundStatement );
//
// CPPNameCollector col = new CPPNameCollector(); CPPNameCollector col = new CPPNameCollector();
// CPPVisitor.visitTranslationUnit( tu, col ); CPPVisitor.visitTranslationUnit( tu, col );
//
// assertEquals( col.size(), 4 ); assertEquals( col.size(), 4 );
//
// IVariable T = (IVariable) col.getName(0).resolveBinding(); IVariable T = (IVariable) col.getName(0).resolveBinding();
// assertInstances( col, T, 3 ); assertInstances( col, T, 3 );
} }
public void testSimpleWhileStatement() throws Exception public void testSimpleWhileStatement() throws Exception

View file

@ -1726,15 +1726,22 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
if_statement.setElseClause( new_if_statement ); if_statement.setElseClause( new_if_statement );
new_if_statement.setParent( if_statement ); new_if_statement.setParent( if_statement );
new_if_statement.setPropertyInParent( IASTIfStatement.ELSE ); new_if_statement.setPropertyInParent( IASTIfStatement.ELSE );
if_statement = new_if_statement;
} }
if_statement = new_if_statement;
continue if_loop; continue if_loop;
} }
IASTStatement elseStatement = statement(); IASTStatement elseStatement = statement();
new_if_statement.setElseClause( elseStatement ); new_if_statement.setElseClause( elseStatement );
elseStatement.setParent( new_if_statement ); elseStatement.setParent( new_if_statement );
elseStatement.setPropertyInParent( IASTIfStatement.ELSE ); elseStatement.setPropertyInParent( IASTIfStatement.ELSE );
if_statement = new_if_statement; if( if_statement != null )
{
if_statement.setElseClause( new_if_statement );
new_if_statement.setParent( if_statement );
new_if_statement.setPropertyInParent( IASTIfStatement.ELSE );
}
else
if_statement = new_if_statement;
} }
else else
if_statement = new_if_statement; if_statement = new_if_statement;

View file

@ -536,6 +536,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return; return;
} }
translationUnit.setLocationResolver(scanner.getLocationResolver());
int lastBacktrack = -1; int lastBacktrack = -1;
while (true) { while (true) {
try { try {

View file

@ -149,7 +149,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
private static final int DEFAULT_CATCH_HANDLER_LIST_SIZE = 4; private static final int DEFAULT_CATCH_HANDLER_LIST_SIZE = 4;
private ScopeStack templateIdScopes = new ScopeStack(); private ScopeStack templateIdScopes = new ScopeStack();
protected IASTTranslationUnit translationUnit; protected CPPASTTranslationUnit translationUnit;
private static class ScopeStack { private static class ScopeStack {
private int[] stack; private int[] stack;
@ -4080,8 +4080,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
logException("translationUnit::createCompilationUnit()", e2); //$NON-NLS-1$ logException("translationUnit::createCompilationUnit()", e2); //$NON-NLS-1$
return; return;
} }
translationUnit.setLocationResolver(scanner.getLocationResolver());
// compilationUnit.enterScope( requestor );
while (true) { while (true) {
try { try {
@ -4145,7 +4144,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
/** /**
* @return * @return
*/ */
protected IASTTranslationUnit createTranslationUnit() { protected CPPASTTranslationUnit createTranslationUnit() {
return new CPPASTTranslationUnit(); return new CPPASTTranslationUnit();
} }

View file

@ -32,7 +32,6 @@ import org.eclipse.cdt.internal.core.parser.token.SimpleToken;
public class DOMScanner extends BaseScanner { public class DOMScanner extends BaseScanner {
private final ICodeReaderFactory codeReaderFactory; private final ICodeReaderFactory codeReaderFactory;
// private int overallOffset = 0;
private static class DOMInclusion private static class DOMInclusion
{ {
@ -110,6 +109,29 @@ public class DOMScanner extends BaseScanner {
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.scanner2.BaseScanner#pushContext(char[])
*/
protected void pushContext(char[] buffer) {
//TODO calibrate offsets
super.pushContext(buffer);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.scanner2.BaseScanner#pushContext(char[], java.lang.Object)
*/
protected void pushContext(char[] buffer, Object data) {
//TODO calibrate offsets
super.pushContext(buffer, data);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.scanner2.BaseScanner#popContext()
*/
protected void popContext() {
//TODO calibrate offsets
super.popContext();
}
/** /**
* @return * @return
*/ */

View file

@ -31,7 +31,6 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserUtil; import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.dom.parser.IRequiresLocationInformation;
import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser;
import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration;
@ -156,8 +155,6 @@ public class InternalASTServiceProvider implements IASTServiceProvider {
} }
} }
IASTTranslationUnit tu = parser.parse(); IASTTranslationUnit tu = parser.parse();
if( tu instanceof IRequiresLocationInformation )
((IRequiresLocationInformation)tu).setLocationResolver( scanner.getLocationResolver() );
return tu; return tu;
} }