diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java index 4dc11ecfe5f..7fcc8aab5b2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseBaseTest.java @@ -10,20 +10,57 @@ *******************************************************************************/ 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.parser.CodeReader; +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.ISourceCodeParser; +import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; +import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; +import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPParserExtensionConfiguration; import org.eclipse.cdt.internal.core.parser.ParserException; +import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner; +import org.eclipse.cdt.internal.core.parser.scanner2.FileCodeReaderFactory; +import org.eclipse.cdt.internal.core.parser.scanner2.GCCScannerExtensionConfiguration; +import org.eclipse.cdt.internal.core.parser.scanner2.GPPScannerExtensionConfiguration; +import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration; +import org.eclipse.core.resources.IFile; /** * @author dsteffle */ -public class AST2SelectionParseBaseTest extends AST2BaseTest { +public class AST2SelectionParseBaseTest extends FileBasePluginTest { + + 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.selectNodeForLocation(tu.getFilePath(), 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); } @@ -32,5 +69,95 @@ public class AST2SelectionParseBaseTest extends AST2BaseTest { IASTTranslationUnit tu = parse(code, lang, useGNUExtensions, expectNoProblems); return tu.selectNodeForLocation(tu.getFilePath(), offset, length); } + + /** + * @param string + * @param c + * @return + * @throws ParserException + */ + protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems ) throws ParserException { + CodeReader codeReader = new CodeReader(code + .toCharArray()); + ScannerInfo scannerInfo = new ScannerInfo(); + IScannerExtensionConfiguration configuration = null; + if( lang == ParserLanguage.C ) + configuration = new GCCScannerExtensionConfiguration(); + else + configuration = new GPPScannerExtensionConfiguration(); + IScanner scanner = new DOMScanner( codeReader, scannerInfo, ParserMode.COMPLETE_PARSE, lang, NULL_LOG, configuration, FileCodeReaderFactory.getInstance() ); + + 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; + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java index 9897677cabf..99b20cf2a8d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java @@ -38,11 +38,17 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; +import org.eclipse.core.resources.IFile; /** * @author dsteffle */ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest { + + public AST2SelectionParseTest(String name) { + super(name, AST2SelectionParseTest.class); + } + public void testBaseCase_VariableReference() throws Exception { String code = "void f() { int x; x=3; }"; //$NON-NLS-1$ @@ -1575,4 +1581,15 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest { IASTNode node = parse( code, ParserLanguage.C, offset1, length ); assertNotNull(node); } + + public void testBug86126() throws Exception { + importFile("foo.h", "int x;\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ + String code = "#include \"foo.h\"\r\n"; //$NON-NLS-1$ + IFile file = importFile("blah.c", code); + int offset1 = code.indexOf( "#include \"foo.h\"" ); //$NON-NLS-1$ + int length = "#include \"foo.h\"".length(); //$NON-NLS-1$ + IASTNode node = parse( file, ParserLanguage.C, offset1, length ); + assertNotNull(node); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java index 4390f9e0d65..347ce702b68 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java @@ -42,13 +42,15 @@ public class DOMScanner extends BaseScanner { public final char[] pt; public final int o; + public final int eo; /** * */ - public DOMInclusion(char[] path, int offset) { + public DOMInclusion(char[] path, int offset, int endOffset) { this.pt = path; this.o = offset; + this.eo = endOffset; } } @@ -135,7 +137,7 @@ public class DOMScanner extends BaseScanner { char[] filenamePath, boolean local, int startOffset, int startingLineNumber, int nameOffset, int nameEndOffset, int nameLine, int endOffset, int endLine, boolean isForced) { - return new DOMInclusion(filenamePath, resolveOffset(startOffset)); + return new DOMInclusion(filenamePath, resolveOffset(startOffset), resolveOffset(endOffset)); } /* @@ -196,8 +198,7 @@ public class DOMScanner extends BaseScanner { if( ! isCircularInclusion( (InclusionData) data )) { DOMInclusion inc = ((DOMInclusion) ((InclusionData) data).inclusion); - locationMap.startInclusion(((InclusionData) data).reader, inc.o, - resolveOffset(getCurrentOffset())); + locationMap.startInclusion(((InclusionData) data).reader, inc.o, inc.eo); bufferDelta[bufferStackPos + 1] = 0; } }