1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-11 19:15:22 +02:00

Test cases and fixes for the location map

This commit is contained in:
Markus Schorn 2007-10-23 11:43:00 +00:00
parent f9aaf04e88
commit bad4dcae70
15 changed files with 882 additions and 96 deletions

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.model.tests.CModelElementsTests;
import org.eclipse.cdt.core.model.tests.StructuralCModelElementsTests;
import org.eclipse.cdt.core.parser.tests.ast2.DOMGCCParserExtensionTestSuite;
import org.eclipse.cdt.core.parser.tests.ast2.DOMParserTestSuite;
import org.eclipse.cdt.core.parser.tests.scanner.ScannerTestSuite;
import org.eclipse.cdt.core.parser.tests.scanner2.IncludeTest;
import org.eclipse.cdt.core.parser.tests.scanner2.ObjectMapTest;
import org.eclipse.cdt.core.parser.tests.scanner2.Scanner2Test;
@ -56,6 +57,7 @@ public class ParserTestSuite extends TestCase {
suite.addTestSuite( IncludeTest.class );
suite.addTest( ScannerParserLoopTest.suite() );
suite.addTest( GCCParserExtensionTestSuite.suite() );
suite.addTest( ScannerTestSuite.suite() );
suite.addTest( DOMParserTestSuite.suite() );
suite.addTest( DOMGCCParserExtensionTestSuite.suite() );
return suite;

View file

@ -26,7 +26,6 @@ public class DOMParserTestSuite extends TestCase {
public static Test suite() {
TestSuite suite= new TestSuite(ParserTestSuite.class.getName());
suite.addTest(LexerTests.suite());
suite.addTest(DOMScannerTests.suite());
suite.addTest(AST2Tests.suite());
suite.addTestSuite( GCCTests.class );

View file

@ -8,13 +8,14 @@
* Contributors:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
package org.eclipse.cdt.core.parser.tests.scanner;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.parser.IGCCToken;
import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.tests.ast2.TestLexerLog;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.parser.scanner.Lexer;
import org.eclipse.cdt.internal.core.parser.scanner.Token;

View file

@ -0,0 +1,489 @@
/*******************************************************************************
* Copyright (c) 2007 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.scanner;
import java.io.IOException;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTComment;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElifStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElseStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorEndifStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorErrorStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfndefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorUndefStatement;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
import org.eclipse.cdt.internal.core.parser.scanner.ILocationCtx;
import org.eclipse.cdt.internal.core.parser.scanner.IPreprocessorMacro;
import org.eclipse.cdt.internal.core.parser.scanner.LocationMap;
public class LocationMapTests extends BaseTestCase {
private static final String FN = "filename";
private static final int ROLE_DEFINITION = IASTNameOwner.r_definition;
private static final int ROLE_UNCLEAR = IASTNameOwner.r_unclear;
private static final ASTNodeProperty PROP_PST = IASTTranslationUnit.PREPROCESSOR_STATEMENT;
final static char[] DIGITS= "0123456789abcdef".toCharArray();
private LocationMap fLocationMap;
private CPPASTTranslationUnit fTu;
public static TestSuite suite() {
return suite(LocationMapTests.class);
}
protected void setUp() throws Exception {
super.setUp();
fLocationMap= new LocationMap();
}
protected void tearDown() throws Exception {
fLocationMap= null;
super.tearDown();
}
protected StringBuffer[] getContents(int sections) throws IOException {
return TestSourceReader.getContentsForTest(
CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections);
}
private void init(char[] content) {
fLocationMap.pushTranslationUnit(FN, content);
fTu= new CPPASTTranslationUnit();
fTu.setLocationResolver(fLocationMap);
}
private void checkASTNode(IASTNode node, IASTNode parent, ASTNodeProperty property,
String filename, int offset, int length, int line, int endline, String sig) {
assertTrue(node.contains(node));
assertSame(parent, node.getParent());
assertEquals(property, node.getPropertyInParent());
assertSame(parent.getTranslationUnit(), node.getTranslationUnit());
if (offset >= 0) {
assertEquals(filename, node.getContainingFilename());
IASTFileLocation loc= node.getFileLocation();
checkLocation(loc, filename, offset, length, line, endline);
assertEquals(sig, node.getRawSignature());
}
else {
try {
node.getContainingFilename();
fail();
}
catch (UnsupportedOperationException e) {
}
try {
node.getFileLocation();
fail();
}
catch (UnsupportedOperationException e) {
}
try {
node.getRawSignature();
fail();
}
catch (UnsupportedOperationException e) {
}
}
}
private void checkName(IASTName name, IBinding binding, String nameString,
IASTNode parent, ASTNodeProperty property, int role,
String filename, int offset, int length, int line, int endline, String sig) {
assertSame(binding, name.getBinding());
assertSame(binding, name.resolveBinding());
assertEquals(Linkage.NO_LINKAGE, name.getLinkage());
assertEquals(nameString, name.toString());
checkASTNode(name, parent, property, filename, offset, length, line, endline, sig);
assertEquals(name.isDeclaration(), role == IASTNameOwner.r_declaration);
assertEquals(name.isDefinition(), role == ROLE_DEFINITION);
assertEquals(name.isReference(), role == IASTNameOwner.r_reference);
}
private void checkLocation(IASTFileLocation loc, String filename, int offset, int length, int line, int endline) {
assertEquals(filename, loc.getFileName());
assertEquals(offset, loc.getNodeOffset());
assertEquals(length, loc.getNodeLength());
assertEquals(line, loc.getStartingLineNumber());
assertEquals(endline, loc.getEndingLineNumber());
}
private void checkComment(IASTComment comment, String content, boolean blockComment,
String filename, int offset, int length, int line, int endline) {
assertEquals(content, new String(comment.getComment()));
assertEquals(blockComment, comment.isBlockComment());
checkASTNode(comment, fTu, PROP_PST, filename, offset, length, line, endline, content);
assertEquals(filename, comment.getContainingFilename());
assertEquals(content, new String(comment.getComment()));
assertEquals(blockComment, comment.isBlockComment());
}
private void checkProblem(IASTProblem problem, int id, String arg, String marked,
String filename, int offset, int length, int line, int endline) {
assertEquals(id, problem.getID());
assertEquals(arg, problem.getArguments());
assertFalse(problem.isError());
assertTrue(problem.isWarning());
checkASTNode(problem, fTu, IASTTranslationUnit.SCANNER_PROBLEM, filename, offset, length, line, endline, marked);
}
private void checkError(IASTPreprocessorStatement s, String directive, String condition,
String filename, int offset, int length, int line) {
IASTPreprocessorErrorStatement st= (IASTPreprocessorErrorStatement) s;
assertEquals(condition, new String(st.getMessage()));
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkPragma(IASTPreprocessorStatement s, String directive, String condition,
String filename, int offset, int length, int line) {
IASTPreprocessorPragmaStatement st= (IASTPreprocessorPragmaStatement) s;
assertEquals(condition, new String(st.getMessage()));
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkInclude(IASTPreprocessorIncludeStatement include, String directive,
String nameImage, String name, String fileTarget, boolean user, boolean active,
String filename, int offset, int length, int line, int nameOffset, int nameLength) {
assertEquals(fileTarget, include.getPath());
assertEquals(user, !include.isSystemInclude());
assertEquals(active, include.isActive());
assertEquals(fileTarget.length() > 0, include.isResolved());
checkName(include.getName(), null, name, include, IASTPreprocessorIncludeStatement.INCLUDE_NAME, ROLE_UNCLEAR, filename, nameOffset, nameLength, line, line, nameImage);
checkASTNode(include, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkIf(IASTPreprocessorStatement s, String directive, String condition, boolean active,
String filename, int offset, int length, int line) {
IASTPreprocessorIfStatement st= (IASTPreprocessorIfStatement) s;
assertEquals(condition, new String(st.getCondition()));
assertEquals(active, st.taken());
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkIfdef(IASTPreprocessorStatement s, String directive, String condition, boolean active,
String filename, int offset, int length, int line) {
IASTPreprocessorIfdefStatement st= (IASTPreprocessorIfdefStatement) s;
assertEquals(condition, new String(st.getCondition()));
assertEquals(active, st.taken());
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkIfndef(IASTPreprocessorStatement s, String directive, String condition, boolean active,
String filename, int offset, int length, int line) {
IASTPreprocessorIfndefStatement st= (IASTPreprocessorIfndefStatement) s;
assertEquals(condition, new String(st.getCondition()));
assertEquals(active, st.taken());
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkElif(IASTPreprocessorStatement s, String directive, String condition, boolean active,
String filename, int offset, int length, int line) {
IASTPreprocessorElifStatement st= (IASTPreprocessorElifStatement) s;
assertEquals(condition, new String(st.getCondition()));
assertEquals(active, st.taken());
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkElse(IASTPreprocessorStatement s, String directive, boolean active,
String filename, int offset, int length, int line) {
IASTPreprocessorElseStatement st= (IASTPreprocessorElseStatement) s;
assertEquals(active, st.taken());
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkEndif(IASTPreprocessorStatement s, String directive,
String filename, int offset, int length, int line) {
IASTPreprocessorEndifStatement st= (IASTPreprocessorEndifStatement) s;
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, directive);
}
private void checkMacroDefinition(IASTPreprocessorMacroDefinition macro, IBinding binding, String image, String name,
String nameImage, String expansion, String[] parameters,
String filename, int offset, int length, int line, int nameOffset, int nameLength) {
assertEquals(expansion, macro.getExpansion());
checkName(macro.getName(), binding, name, macro, IASTPreprocessorMacroDefinition.MACRO_NAME, ROLE_DEFINITION, filename, nameOffset, nameLength, line, line, nameImage);
checkASTNode(macro, fTu, PROP_PST, filename, offset, length, line, line, image);
if (parameters != null) {
IASTPreprocessorFunctionStyleMacroDefinition fd= (IASTPreprocessorFunctionStyleMacroDefinition) macro;
IASTFunctionStyleMacroParameter[] params= fd.getParameters();
for (int i = 0; i < params.length; i++) {
IASTFunctionStyleMacroParameter mp = params[i];
assertEquals(parameters[i], mp.getParameter());
checkASTNode(mp, fd, IASTPreprocessorFunctionStyleMacroDefinition.PARAMETER, filename, -1, 0, -1, 0, null);
}
}
}
private void checkMacroUndef(IASTPreprocessorStatement s, IBinding binding, String image, String name, String nameImage,
String filename, int offset, int length, int line, int nameOffset, int nameLength) {
IASTPreprocessorUndefStatement st= (IASTPreprocessorUndefStatement) s;
checkName(st.getMacroName(), binding, name, st, IASTPreprocessorUndefStatement.MACRO_NAME, ROLE_UNCLEAR, filename, nameOffset, nameLength, line, line, nameImage);
checkASTNode(st, fTu, PROP_PST, filename, offset, length, line, line, image);
}
public void testComment() {
init(DIGITS);
fLocationMap.encounteredComment(0, 0, false);
fLocationMap.encounteredComment(1,3, true);
fLocationMap.encounteredComment(5,16,true);
IASTComment[] comments= fLocationMap.getComments();
assertEquals(3, comments.length);
checkComment(comments[0], "", false, FN, 0, 0, 1, 1);
checkComment(comments[1], "12", true, FN, 1,2,1,1);
checkComment(comments[2], "56789abcdef", true, FN, 5,11,1,1);
}
public void testProblems() {
init(DIGITS);
fLocationMap.encounterProblem(0, null, 0, 0);
fLocationMap.encounterProblem(1, "a".toCharArray(), 1, 3);
fLocationMap.encounterProblem(2, "b".toCharArray(), 5,16);
IASTProblem[] problems= fLocationMap.getScannerProblems();
assertEquals(3, problems.length);
checkProblem(problems[0], 0, "", "", FN, 0,0,1,1);
checkProblem(problems[1], 1, "a", "12", FN,1,2,1,1);
checkProblem(problems[2], 2, "b", "56789abcdef", FN,5,11,1,1);
}
public void testPoundError() {
init(DIGITS);
fLocationMap.encounterPoundError(0, 0, 0, 0);
fLocationMap.encounterPoundError(0, 1, 3, 16);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkError(prep[0], "", "",FN,0,0,1);
checkError(prep[1], new String(DIGITS), "12", FN,0,16,1);
}
public void testPragma() {
init(DIGITS);
fLocationMap.encounterPoundPragma(0, 0, 0, 0);
fLocationMap.encounterPoundPragma(0, 1, 3, 16);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkPragma(prep[0], "", "", FN,0,0,1);
checkPragma(prep[1], new String(DIGITS), "12", FN,0,16,1);
}
public void testIncludes() {
init(DIGITS);
fLocationMap.encounterPoundInclude(0, 0, 0, 0, "n1".toCharArray(), null, true, false);
fLocationMap.encounterPoundInclude(0, 1, 3, 16, "n2".toCharArray(), "f2", false , true);
IASTPreprocessorIncludeStatement[] includes= fLocationMap.getIncludeDirectives();
assertEquals(2, includes.length);
checkInclude(includes[0], "", "", "n1", "", true, false, FN, 0, 0, 1, 0, 0);
checkInclude(includes[1], new String(DIGITS), "12", "n2", "f2", false, true, FN, 0, 16, 1, 1, 2);
}
public void testIf() {
init(DIGITS);
fLocationMap.encounterPoundIf(0, 0, 0, 0, false);
fLocationMap.encounterPoundIf(0, 1, 3, 16, true);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkIf(prep[0], "", "", false, FN, 0, 0, 1);
checkIf(prep[1], new String(DIGITS), "12", true, FN, 0, 16, 1);
}
public void testIfdef() {
init(DIGITS);
fLocationMap.encounterPoundIfdef(0, 0, 0, 0, false);
fLocationMap.encounterPoundIfdef(0, 1, 3, 16, true);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkIfdef(prep[0], "", "", false, FN, 0, 0, 1);
checkIfdef(prep[1], new String(DIGITS), "12", true, FN, 0, 16, 1);
}
public void testIfndef() {
init(DIGITS);
fLocationMap.encounterPoundIfndef(0, 0, 0, 0, false);
fLocationMap.encounterPoundIfndef(0, 1, 3, 16, true);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkIfndef(prep[0], "", "", false, FN, 0, 0, 1);
checkIfndef(prep[1], new String(DIGITS), "12", true, FN, 0, 16, 1);
}
public void testElif() {
init(DIGITS);
fLocationMap.encounterPoundElif(0, 0, 0, 0, false);
fLocationMap.encounterPoundElif(0, 1, 3, 16, true);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkElif(prep[0], "", "", false, FN, 0, 0, 1);
checkElif(prep[1], new String(DIGITS), "12", true, FN, 0, 16, 1);
}
public void testElse() {
init(DIGITS);
fLocationMap.encounterPoundElse(0, 0, false);
fLocationMap.encounterPoundElse(0, 16, true);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkElse(prep[0], "", false, FN, 0, 0, 1);
checkElse(prep[1], new String(DIGITS), true, FN, 0, 16, 1);
}
public void testEndif() {
init(DIGITS);
fLocationMap.encounterPoundEndIf(0, 0);
fLocationMap.encounterPoundEndIf(0, 16);
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkEndif(prep[0], "", FN, 0, 0, 1);
checkEndif(prep[1], new String(DIGITS), FN, 0, 16, 1);
}
public void testDefine() {
IMacroBinding macro1= new TestMacro("n1", "exp1", null);
final String[] params = new String[]{"p1", "p2"};
IMacroBinding macro2= new TestMacro("n2", "exp2", params);
init(DIGITS);
fLocationMap.encounterPoundDefine(0, 0, 0, 0, 0, macro1);
fLocationMap.encounterPoundDefine(0, 1, 3, 10, 16, macro2);
IASTPreprocessorMacroDefinition[] prep= fLocationMap.getMacroDefinitions();
assertEquals(2, prep.length);
checkMacroDefinition(prep[0], macro1, "", "n1", "", "exp1", null, FN, 0, 0, 1, 0, 0);
checkMacroDefinition(prep[1], macro2, new String(DIGITS), "n2", "12", "exp2", params, FN, 0, 16, 1, 1, 2);
}
public void testPredefine() {
IMacroBinding macro1= new TestMacro("n1", "exp1", null);
final String[] params = new String[]{"p1", "p2"};
IMacroBinding macro2= new TestMacro("n2", "exp2", params);
init(DIGITS);
fLocationMap.registerPredefinedMacro(macro1);
fLocationMap.registerPredefinedMacro(macro2);
IASTPreprocessorMacroDefinition[] prep= fLocationMap.getBuiltinMacroDefinitions();
assertEquals(2, prep.length);
checkMacroDefinition(prep[0], macro1, "", "n1", "n1", "exp1", null, FN, -1, 0, 0, -1, 0);
checkMacroDefinition(prep[1], macro2, "", "n2", "n2", "exp2", params, FN, -1, 0, 0, -1, 0);
}
public void testIndexDefine() {
IPreprocessorMacro macro1= new TestMacro("n1", "exp1", null);
final String[] params = new String[]{"p1", "p2"};
IPreprocessorMacro macro2= new TestMacro("n2", "exp2", params);
init(DIGITS);
fLocationMap.registerMacroFromIndex(macro1, "fidx1", 0, 0, 0);
fLocationMap.registerMacroFromIndex(macro2, "fidx2", 1, 4, 8);
IASTPreprocessorMacroDefinition[] prep= fLocationMap.getBuiltinMacroDefinitions();
assertEquals(2, prep.length);
checkMacroDefinition(prep[0], macro1, "", "n1", "n1", "exp1", null, "fidx1", -1, 0, 0, 0, 0);
checkMacroDefinition(prep[1], macro2, "", "n2", "n2", "exp2", params, "fidx2", -1, 0, 0, 1, 3);
}
public void testUndefine() {
IPreprocessorMacro macro1= new TestMacro("n1", "exp1", null);
init(DIGITS);
fLocationMap.encounterPoundUndef(null, 0, 0, 0, 0, "n1".toCharArray());
fLocationMap.encounterPoundUndef(macro1, 0, 3, 7, 16, "n2".toCharArray());
IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements();
assertEquals(2, prep.length);
checkMacroUndef(prep[0], null, "", "n1", "", FN, 0, 0, 1, 0, 0);
checkMacroUndef(prep[1], macro1, new String(DIGITS), "n2", "3456", FN, 0, 16, 1, 3, 4);
}
public void testContexts() {
init(DIGITS);
assertEquals(FN, fLocationMap.getTranslationUnitPath());
assertEquals(FN, fLocationMap.getCurrentFilename());
// number: [30,36)[46,50)
ILocationCtx pre1= fLocationMap.pushPreInclusion("0102030405".toCharArray(), 0, false);
assertEquals(FN, fLocationMap.getCurrentFilename());
// number: [0,6)[26,30)
ILocationCtx pre2= fLocationMap.pushPreInclusion("a1a2a3a4a5".toCharArray(), 0, true);
assertEquals(FN, fLocationMap.getCurrentFilename());
fLocationMap.encounteredComment(0,2,true);
// number: [6,15)[25,26)
ILocationCtx i1= fLocationMap.pushInclusion(0, 2, 4, 6, "b1b2b3b4b5".toCharArray(), "pre1", "pre1".toCharArray(), false);
assertEquals("pre1", fLocationMap.getCurrentFilename());
fLocationMap.encounteredComment(2,4,true);
// number: [15,25)
ILocationCtx i2= fLocationMap.pushInclusion(6, 7, 8, 9, "c1c2c3c4c5".toCharArray(), "pre11", "pre11".toCharArray(), false);
assertEquals("pre11", fLocationMap.getCurrentFilename());
fLocationMap.encounteredComment(2,6,true);
fLocationMap.popContext(i2);
// add a comment before the include
fLocationMap.encounteredComment(4,6,false);
assertEquals("pre1", fLocationMap.getCurrentFilename());
fLocationMap.popContext(i1);
assertEquals(FN, fLocationMap.getCurrentFilename());
fLocationMap.popContext(pre2);
assertEquals(FN, fLocationMap.getCurrentFilename());
// number [36, 46)
ILocationCtx i3= fLocationMap.pushInclusion(0, 2, 4, 6, "d1d2d3d4d5".toCharArray(), "pre2", "pre2".toCharArray(), false);
assertEquals("pre2", fLocationMap.getCurrentFilename());
fLocationMap.encounteredComment(0,2,true);
fLocationMap.popContext(i3);
fLocationMap.popContext(pre1);
assertEquals(FN, fLocationMap.getCurrentFilename());
IASTComment[] comments= fLocationMap.getComments();
checkComment(comments[0], "", true, FN, 0, 0, 1, 1);
checkComment(comments[1], "b2", true, "pre1", 2, 2, 1, 1);
checkComment(comments[2], "c2c3", true, "pre11", 2, 4, 1, 1);
checkComment(comments[3], "b3", false, "pre1", 4, 2, 1, 1);
checkComment(comments[4], "d1", true, "pre2", 0, 2, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(0, 6), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(6, 9), "pre1", 0, 9, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(15, 10), "pre11", 0, 10, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(25, 1), "pre1", 9, 1, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(26, 4), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(30, 6), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(36, 10), "pre2", 0, 10, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(46, 4), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(0, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(5, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(6, 0), "pre1", 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(14, 0), "pre1", 8, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(15, 0), "pre11", 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(24, 0), "pre11", 9, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(25, 0), "pre1", 9, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(26, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(29, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(30, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(35, 0), FN, 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(36, 0), "pre2", 0, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(45, 0), "pre2", 9, 0, 1, 1);
checkLocation(fLocationMap.getMappedFileLocation(46, 0), FN, 0, 0, 1, 1);
}
}

View file

@ -0,0 +1,29 @@
/*******************************************************************************
* Copyright (c) 2007 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:
* IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Emanuel Graf (IFS)
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.scanner;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* @author jcamelon
*/
public class ScannerTestSuite extends TestSuite {
public static Test suite() {
TestSuite suite= new ScannerTestSuite();
suite.addTest(LexerTests.suite());
suite.addTest(LocationMapTests.suite());
return suite;
}
}

View file

@ -0,0 +1,73 @@
/*******************************************************************************
* Copyright (c) 2007 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.scanner;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.internal.core.parser.scanner.IPreprocessorMacro;
import org.eclipse.core.runtime.CoreException;
final class TestMacro implements IPreprocessorMacro {
private String fName;
private String fExpansion;
private String[] fParams;
public TestMacro(String name, String expansion, String[] params) {
fName= name;
fExpansion= expansion;
fParams= params;
}
public char[] getExpansion() {
return fExpansion.toCharArray();
}
public boolean isFunctionStyle() {
return fParams != null;
}
public ILinkage getLinkage() throws CoreException {
return null;
}
public String getName() {
return fName;
}
public char[] getNameCharArray() {
return fName.toCharArray();
}
public IScope getScope() throws DOMException {
return null;
}
public Object getAdapter(Class adapter) {
return null;
}
public char[][] getParameterList() {
if (fParams == null) {
return null;
}
char[][] result= new char[fParams.length][];
for (int i = 0; i < result.length; i++) {
result[i]= fParams[i].toCharArray();
}
return result;
}
public String getFilename() {
// mstodo Auto-generated method stub
return null;
}
}

View file

@ -28,4 +28,9 @@ public interface IMacroBinding extends IBinding {
* @since 5.0
*/
boolean isFunctionStyle();
/**
* Returns the parameter names or <code>null</code> if this is not a function style macro.
*/
char[][] getParameterList();
}

View file

@ -64,12 +64,29 @@ class ASTPreprocessorName extends ASTPreprocessorNode implements IASTName {
public void setBinding(IBinding binding) {assert false;}
}
class ASTBuiltinName extends ASTPreprocessorName {
final private String fFilename;
public ASTBuiltinName(IASTNode parent, ASTNodeProperty property, String filename, int startNumber, int endNumber, char[] name, IBinding binding) {
class ASTPreprocessorDefinition extends ASTPreprocessorName {
public ASTPreprocessorDefinition(IASTNode parent, ASTNodeProperty property, int startNumber,
int endNumber, char[] name, IBinding binding) {
super(parent, property, startNumber, endNumber, name, binding);
fFilename= filename;
}
public boolean isDefinition() {
return true;
}
}
class ASTBuiltinName extends ASTPreprocessorDefinition {
private final ASTFileLocationForBuiltins fFileLocation;
public ASTBuiltinName(IASTNode parent, ASTNodeProperty property, String filename, int nameOffset, int nameEndOffset, char[] name, IBinding binding) {
super(parent, property, -1, -1, name, binding);
if (filename != null) {
fFileLocation= new ASTFileLocationForBuiltins(filename, nameOffset, nameEndOffset-nameOffset);
}
else {
fFileLocation= null;
}
}
public boolean contains(IASTNode node) {
@ -77,17 +94,24 @@ class ASTBuiltinName extends ASTPreprocessorName {
}
public String getContainingFilename() {
return fFilename;
if (fFileLocation == null) {
throw new UnsupportedOperationException();
}
return fFileLocation.getFileName();
}
public IASTFileLocation getFileLocation() {
// mstodo Auto-generated method stub
return null;
if (fFileLocation == null) {
throw new UnsupportedOperationException();
}
return fFileLocation;
}
public IASTNodeLocation[] getNodeLocations() {
// mstodo Auto-generated method stub
return null;
if (fFileLocation == null) {
throw new UnsupportedOperationException();
}
return new IASTNodeLocation[]{fFileLocation};
}
public int getOffset() {
@ -95,6 +119,9 @@ class ASTBuiltinName extends ASTPreprocessorName {
}
public String getRawSignature() {
if (fFileLocation == null) {
throw new UnsupportedOperationException();
}
return toString();
}
}

View file

@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorUndefStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode;
@ -54,6 +55,49 @@ abstract class ASTPreprocessorNode extends ASTNode {
IASTNodeLocation[] loc=tu.getLocationInfo(offset, length);
return tu.getUnpreprocessedSignature(loc);
}
public IASTNodeLocation[] getNodeLocations() {
if (getLength() == 0) {
return getTranslationUnit().getLocationInfo(getOffset(), 0);
}
return super.getNodeLocations();
}
public String getContainingFilename() {
if (super.getOffset() == -1) {
throw new UnsupportedOperationException();
}
return super.getContainingFilename();
}
public IASTFileLocation getFileLocation() {
if (super.getOffset() == -1) {
throw new UnsupportedOperationException();
}
return super.getFileLocation();
}
public int getLength() {
if (super.getOffset() == -1) {
throw new UnsupportedOperationException();
}
return super.getLength();
}
public int getOffset() {
final int offset = super.getOffset();
if (offset == -1) {
throw new UnsupportedOperationException();
}
return offset;
}
public String getRawSignature() {
if (super.getOffset() == -1) {
throw new UnsupportedOperationException();
}
return super.getRawSignature();
}
}
@ -203,7 +247,7 @@ class ASTInclusionStatement extends ASTPreprocessorNode implements IASTPreproces
}
class ASTMacro extends ASTPreprocessorNode implements IASTPreprocessorMacroDefinition {
private final IASTName fName;
private final ASTPreprocessorName fName;
/**
* Regular constructor.
@ -211,15 +255,16 @@ class ASTMacro extends ASTPreprocessorNode implements IASTPreprocessorMacroDefin
public ASTMacro(IASTTranslationUnit parent, IMacroBinding macro,
int startNumber, int nameNumber, int nameEndNumber, int expansionNumber, int endNumber) {
super(parent, IASTTranslationUnit.PREPROCESSOR_STATEMENT, startNumber, endNumber);
fName= new ASTPreprocessorName(this, IASTPreprocessorMacroDefinition.MACRO_NAME, nameNumber, nameEndNumber, macro.getNameCharArray(), macro);
fName= new ASTPreprocessorDefinition(this, IASTPreprocessorMacroDefinition.MACRO_NAME, nameNumber, nameEndNumber, macro.getNameCharArray(), macro);
}
/**
* Constructor for built-in macros
* @param expansionOffset
*/
public ASTMacro(IASTTranslationUnit parent, IMacroBinding macro, String filename, int nameNumber, int nameEndNumber) {
super(parent, IASTTranslationUnit.PREPROCESSOR_STATEMENT, 0, 0);
fName= new ASTBuiltinName(this, IASTPreprocessorMacroDefinition.MACRO_NAME, filename, nameNumber, nameEndNumber, macro.getNameCharArray(), macro);
public ASTMacro(IASTTranslationUnit parent, IMacroBinding macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) {
super(parent, IASTTranslationUnit.PREPROCESSOR_STATEMENT, -1, -1);
fName= new ASTBuiltinName(this, IASTPreprocessorMacroDefinition.MACRO_NAME, filename, nameOffset, nameEndOffset, macro.getNameCharArray(), macro);
}
protected IMacroBinding getMacro() {
@ -242,10 +287,11 @@ class ASTMacro extends ASTPreprocessorNode implements IASTPreprocessorMacroDefin
public void setName(IASTName name) {assert false;}
}
class ASTMacroParameter extends ASTNode implements IASTFunctionStyleMacroParameter {
class ASTMacroParameter extends ASTPreprocessorNode implements IASTFunctionStyleMacroParameter {
private final String fParameter;
public ASTMacroParameter(char[] param) {
public ASTMacroParameter(IASTPreprocessorFunctionStyleMacroDefinition parent, char[] param, int offset, int endOffset) {
super(parent, IASTPreprocessorFunctionStyleMacroDefinition.PARAMETER, offset, endOffset);
fParameter= new String(param);
}
@ -269,16 +315,16 @@ class ASTFunctionMacro extends ASTMacro implements IASTPreprocessorFunctionStyle
* Constructor for builtins
*/
public ASTFunctionMacro(IASTTranslationUnit parent, IMacroBinding macro,
String filename, int nameNumber, int nameEndNumber) {
super(parent, macro, filename, nameNumber, nameEndNumber);
String filename, int nameOffset, int nameEndOffset, int expansionOffset) {
super(parent, macro, filename, nameOffset, nameEndOffset, expansionOffset);
}
public IASTFunctionStyleMacroParameter[] getParameters() {
FunctionStyleMacro macro= (FunctionStyleMacro) getMacro();
char[][] paramList= macro.getParamList();
public IASTFunctionStyleMacroParameter[] getParameters() {
IMacroBinding macro= getMacro();
char[][] paramList= macro.getParameterList();
IASTFunctionStyleMacroParameter[] result= new IASTFunctionStyleMacroParameter[paramList.length];
for (int i = 0; i < result.length; i++) {
result[i]= new ASTMacroParameter(paramList[i]);
result[i]= new ASTMacroParameter(this, paramList[i], -1, -1);
}
return result;
}
@ -289,9 +335,9 @@ class ASTFunctionMacro extends ASTMacro implements IASTPreprocessorFunctionStyle
class ASTUndef extends ASTPreprocessorNode implements IASTPreprocessorUndefStatement {
private final IASTName fName;
public ASTUndef(IASTTranslationUnit parent, char[] name, int startNumber, int nameNumber, int nameEndNumber, int endNumber) {
public ASTUndef(IASTTranslationUnit parent, char[] name, int startNumber, int nameNumber, int nameEndNumber, int endNumber, IBinding binding) {
super(parent, IASTTranslationUnit.PREPROCESSOR_STATEMENT, startNumber, endNumber);
fName= new ASTPreprocessorName(this, IASTPreprocessorUndefStatement.MACRO_NAME, nameNumber, nameEndNumber, name, null);
fName= new ASTPreprocessorName(this, IASTPreprocessorUndefStatement.MACRO_NAME, nameNumber, nameEndNumber, name, binding);
}
public IASTName getMacroName() {
@ -336,18 +382,59 @@ class DependencyTree extends ASTInclusionNode implements IDependencyTree {
}
class ASTFileLocation implements IASTFileLocation {
private String fFilename;
private FileLocationCtx fLocationCtx;
private int fOffset;
private int fLength;
public ASTFileLocation(String filename, int startOffset, int length) {
fFilename= filename;
public ASTFileLocation(FileLocationCtx fileLocationCtx, int startOffset, int length) {
fLocationCtx= fileLocationCtx;
fOffset= startOffset;
fLength= length;
}
public String getFileName() {
return fFilename;
return fLocationCtx.getFilename();
}
public IASTFileLocation asFileLocation() {
return this;
}
public int getNodeLength() {
return fLength;
}
public int getNodeOffset() {
return fOffset;
}
public int getEndingLineNumber() {
int end= fLength > 0 ? fOffset+fLength-1 : fOffset;
return fLocationCtx.getLineNumber(end);
}
public int getStartingLineNumber() {
return fLocationCtx.getLineNumber(fOffset);
}
public char[] getSource() {
return fLocationCtx.getSource(fOffset, fLength);
}
}
class ASTFileLocationForBuiltins implements IASTFileLocation {
private String fFile;
private int fOffset;
private int fLength;
public ASTFileLocationForBuiltins(String file, int startOffset, int length) {
fFile= file;
fOffset= startOffset;
fLength= length;
}
public String getFileName() {
return fFile;
}
public IASTFileLocation asFileLocation() {

View file

@ -17,24 +17,24 @@ import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.internal.core.parser.ParserMessages;
/**
* Models the problems found by the preprocessor or lexer.
*/
class ASTProblem extends ASTNode implements IASTProblem {
class ASTProblem extends ASTPreprocessorNode implements IASTProblem {
private final int id;
private final char[] arg;
private String message = null;
public ASTProblem(int id, char[] arg, int startNumber, int endNumber) {
public ASTProblem(IASTTranslationUnit tu, int id, char[] arg, int startNumber, int endNumber) {
super(tu, IASTTranslationUnit.SCANNER_PROBLEM, startNumber, endNumber);
this.id = id;
this.arg = arg;
setOffsetAndLength(startNumber, endNumber-startNumber);
}
public int getID() {

View file

@ -17,5 +17,4 @@ package org.eclipse.cdt.internal.core.parser.scanner;
* @since 5.0
*/
public interface ILocationCtx {
}

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.parser.scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
@ -21,16 +22,19 @@ import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
* @since 5.0
*/
abstract class LocationCtx implements ILocationCtx {
final LocationCtx fParent;
final ContainerLocationCtx fParent;
final int fSequenceNumber;
final int fParentOffset;
final int fParentEndOffset;
public LocationCtx(LocationCtx parent, int parentOffset, int parentEndOffset, int sequenceNumber) {
public LocationCtx(ContainerLocationCtx parent, int parentOffset, int parentEndOffset, int sequenceNumber) {
fParent= parent;
fParentOffset= parentOffset;
fParentEndOffset= parentEndOffset;
fSequenceNumber= sequenceNumber;
if (parent != null) {
parent.addChild(this);
}
}
public String getFilename() {
@ -73,7 +77,7 @@ abstract class LocationCtx implements ILocationCtx {
* Returns the minimal context containing the specified range, assuming that it is contained in
* this context.
*/
public LocationCtx findContextForSequenceNumberRange(int sequenceNumber, int length) {
public LocationCtx ctxForNumberRange(int sequenceNumber, int length) {
return this;
}
@ -81,15 +85,15 @@ abstract class LocationCtx implements ILocationCtx {
* Returns the minimal file location containing the specified sequence number range, assuming
* that it is contained in this context.
*/
public IASTFileLocation getFileLocationForSequenceNumberRange(int sequenceNumber, int length) {
return fParent.getFileLocationForOffsetRange(fParentOffset, fParentEndOffset-fParentOffset);
public IASTFileLocation fileLocationForNumberRange(int sequenceNumber, int length) {
return fParent.fileLocationForOffsetRange(fParentOffset, fParentEndOffset-fParentOffset);
}
/**
* Returns the file location containing the specified offset range in this context.
*/
public IASTFileLocation getFileLocationForOffsetRange(int parentOffset, int length) {
return fParent.getFileLocationForOffsetRange(fParentOffset, fParentEndOffset-fParentOffset);
public IASTFileLocation fileLocationForOffsetRange(int parentOffset, int length) {
return fParent.fileLocationForOffsetRange(fParentOffset, fParentEndOffset-fParentOffset);
}
/**
@ -110,12 +114,28 @@ class ContainerLocationCtx extends LocationCtx {
private int fChildSequenceLength;
private ArrayList fChildren;
private char[] fSource;
private int[] fLineOffsets;
public ContainerLocationCtx(LocationCtx parent, char[] source, int parentOffset, int parentEndOffset, int sequenceNumber) {
public ContainerLocationCtx(ContainerLocationCtx parent, char[] source, int parentOffset, int parentEndOffset, int sequenceNumber) {
super(parent, parentOffset, parentEndOffset, sequenceNumber);
fSource= source;
}
public void addChild(LocationCtx locationCtx) {
if (fChildren == null) {
fChildren= new ArrayList();
}
fChildren.add(locationCtx);
}
public char[] getSource(int offset, int length) {
offset= Math.max(0, Math.min(offset, fSource.length));
length= Math.max(0, Math.min(length, fSource.length-offset));
char[] result= new char[length];
System.arraycopy(fSource, offset, result, 0, length);
return result;
}
public final int getSequenceLength() {
return fSource.length + fChildSequenceLength;
}
@ -139,23 +159,25 @@ class ContainerLocationCtx extends LocationCtx {
fChildSequenceLength+= childLength;
}
public final LocationCtx findContextForSequenceNumberRange(int sequenceNumber, int length) {
public final LocationCtx ctxForNumberRange(int sequenceNumber, int length) {
int testEnd= length > 1 ? sequenceNumber+length-1 : sequenceNumber;
final LocationCtx child= findChildLessOrEqualThan(sequenceNumber);
if (child != null && child.fSequenceNumber+child.getSequenceLength() >= sequenceNumber+length) {
return child;
if (child != null && child.fSequenceNumber+child.getSequenceLength() > testEnd) {
return child.ctxForNumberRange(sequenceNumber, length);
}
return this;
}
public IASTFileLocation getFileLocationForSequenceNumberRange(int sequenceNumber, int length) {
public IASTFileLocation fileLocationForNumberRange(int sequenceNumber, int length) {
// try to delegate to a child.
int useLength= length > 0 ? length-1 : 0;
final LocationCtx child1= findChildLessOrEqualThan(sequenceNumber);
final LocationCtx child2= findChildLessOrEqualThan(sequenceNumber+useLength);
if (child1 == child2 && child1 != null) {
return child1.getFileLocationForOffsetRange(sequenceNumber, length);
int testEnd= length > 1 ? sequenceNumber+length-1 : sequenceNumber;
final LocationCtx child= findChildLessOrEqualThan(sequenceNumber);
if (child != null && child.fSequenceNumber+child.getSequenceLength() > testEnd) {
if (testEnd == sequenceNumber || findChildLessOrEqualThan(testEnd) == child) {
return child.fileLocationForNumberRange(sequenceNumber, length);
}
}
return super.getFileLocationForSequenceNumberRange(sequenceNumber, length);
return super.fileLocationForNumberRange(sequenceNumber, length);
}
final LocationCtx findChildLessOrEqualThan(final int sequenceNumber) {
@ -163,16 +185,6 @@ class ContainerLocationCtx extends LocationCtx {
return null;
}
int upper= fChildren.size();
if (upper < 10) {
for (int i=upper-1; i>=0; i--) {
LocationCtx child= (LocationCtx) fChildren.get(i);
if (child.fSequenceNumber <= sequenceNumber) {
return child;
}
}
return null;
}
int lower= 0;
while (upper > lower) {
int middle= (upper+lower)/2;
@ -201,13 +213,41 @@ class ContainerLocationCtx extends LocationCtx {
}
}
}
public int getLineNumber(int offset) {
if (fLineOffsets == null) {
fLineOffsets= computeLineOffsets();
}
int idx= Arrays.binarySearch(fLineOffsets, offset);
if (idx < 0) {
return -idx;
}
return idx+1;
}
private int[] computeLineOffsets() {
ArrayList offsets= new ArrayList();
for (int i = 0; i < fSource.length; i++) {
if (fSource[i] == '\n') {
offsets.add(new Integer(i));
}
}
int[] result= new int[offsets.size()];
for (int i = 0; i < result.length; i++) {
result[i]= ((Integer) offsets.get(i)).intValue();
}
return result;
}
}
class FileLocationCtx extends ContainerLocationCtx {
private final String fFilename;
private final ASTInclusionStatement fASTInclude;
public FileLocationCtx(LocationCtx parent, String filename, char[] source, int parentOffset, int parentEndOffset, int sequenceNumber, ASTInclusionStatement inclusionStatement) {
public FileLocationCtx(ContainerLocationCtx parent, String filename, char[] source, int parentOffset, int parentEndOffset, int sequenceNumber, ASTInclusionStatement inclusionStatement) {
super(parent, source, parentOffset, parentEndOffset, sequenceNumber);
fFilename= new String(filename);
fASTInclude= inclusionStatement;
@ -224,13 +264,15 @@ class FileLocationCtx extends ContainerLocationCtx {
return fFilename;
}
public IASTFileLocation getFileLocationForSequenceNumberRange(int sequenceNumber, int length) {
public IASTFileLocation fileLocationForNumberRange(int sequenceNumber, int length) {
// try to delegate to a child.
final int testEnd= length > 1 ? sequenceNumber+length-1 : sequenceNumber;
final int sequenceEnd= sequenceNumber+length;
final LocationCtx child1= findChildLessOrEqualThan(sequenceNumber);
final LocationCtx child2= sequenceEnd == sequenceNumber ? child1 : findChildLessOrEqualThan(sequenceEnd-1);
if (child1 == child2 && child1 != null) {
return child1.getFileLocationForOffsetRange(sequenceNumber, length);
final LocationCtx child2= testEnd == sequenceNumber ? child1 : findChildLessOrEqualThan(testEnd);
if (child1 == child2 && child1 != null && child1.fSequenceNumber + child1.getSequenceLength() > testEnd) {
return child1.fileLocationForNumberRange(sequenceNumber, length);
}
// handle here
@ -261,12 +303,11 @@ class FileLocationCtx extends ContainerLocationCtx {
endOffset= child2.fParentEndOffset;
}
}
return new ASTFileLocation(fFilename, startOffset, endOffset-startOffset);
return new ASTFileLocation(this, startOffset, endOffset-startOffset);
}
public int getLineNumber(int offset) {
// mstodo Auto-generated method stub
return super.getLineNumber(offset);
public IASTFileLocation fileLocationForOffsetRange(int offset, int length) {
return new ASTFileLocation(this, offset, length);
}
public ASTInclusionStatement getInclusionStatement() {
@ -278,7 +319,7 @@ class FileLocationCtx extends ContainerLocationCtx {
class MacroExpansionCtx extends LocationCtx {
private final int fLength;
public MacroExpansionCtx(LocationCtx parent, int parentOffset, int parentEndOffset,
public MacroExpansionCtx(ContainerLocationCtx parent, int parentOffset, int parentEndOffset,
int sequenceNumber, int length, ImageLocationInfo[] imageLocations, ASTPreprocessorName expansion) {
super(parent, parentOffset, parentEndOffset, sequenceNumber);
fLength= length;

View file

@ -15,6 +15,7 @@ import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.IASTComment;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
@ -25,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IMacroBinding;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ASTPreprocessorSelectionResult;
/**
@ -54,20 +56,20 @@ public class LocationMap implements ILocationResolver {
public void registerPredefinedMacro(IMacroBinding macro) {
registerPredefinedMacro(macro, getCurrentFilename(), 0, 0);
registerPredefinedMacro(macro, null, -1, -1, -1);
}
public void registerMacroFromIndex(IMacroBinding macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) {
registerPredefinedMacro(macro, filename, getSequenceNumberForOffset(nameOffset), getSequenceNumberForOffset(nameEndOffset));
public void registerMacroFromIndex(IPreprocessorMacro macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) {
registerPredefinedMacro(macro, filename, nameOffset, nameEndOffset, expansionOffset);
}
private void registerPredefinedMacro(IMacroBinding macro, String filename, int nameNumber, int nameEndNumber) {
private void registerPredefinedMacro(IMacroBinding macro, String filename, int nameOffset, int nameEndOffset, int expansionOffset) {
ASTMacro astmacro;
if (macro.isFunctionStyle()) {
astmacro= new ASTFunctionMacro(fTranslationUnit, macro, filename, nameNumber, nameEndNumber);
astmacro= new ASTFunctionMacro(fTranslationUnit, macro, filename, nameOffset, nameEndOffset, expansionOffset);
}
else {
astmacro= new ASTMacro(fTranslationUnit, macro, filename, nameNumber, nameEndNumber);
astmacro= new ASTMacro(fTranslationUnit, macro, filename, nameOffset, nameEndOffset, expansionOffset);
}
fBuiltinMacros.add(astmacro);
}
@ -91,9 +93,9 @@ public class LocationMap implements ILocationResolver {
* @param isMacroFile whether the context is used for running the preprocessor, only.
*/
public ILocationCtx pushPreInclusion(char[] buffer, int offset, boolean isMacroFile) {
assert fCurrentContext != null;
assert fCurrentContext instanceof ContainerLocationCtx;
int sequenceNumber= getSequenceNumberForOffset(offset);
fCurrentContext= new ContainerLocationCtx(fCurrentContext, buffer, offset, offset, sequenceNumber);
fCurrentContext= new ContainerLocationCtx((ContainerLocationCtx) fCurrentContext, buffer, offset, offset, sequenceNumber);
fLastChildInsertionOffset= 0;
return fCurrentContext;
}
@ -110,7 +112,7 @@ public class LocationMap implements ILocationResolver {
*/
public ILocationCtx pushInclusion(int startOffset, int nameOffset, int nameEndOffset, int endOffset,
char[] buffer, String filename, char[] name, boolean userInclude) {
assert fCurrentContext != null;
assert fCurrentContext instanceof ContainerLocationCtx;
int startNumber= getSequenceNumberForOffset(startOffset);
int nameNumber= getSequenceNumberForOffset(nameOffset);
int nameEndNumber= getSequenceNumberForOffset(nameEndOffset);
@ -118,7 +120,7 @@ public class LocationMap implements ILocationResolver {
final ASTInclusionStatement inclusionStatement=
new ASTInclusionStatement(fTranslationUnit, startNumber, nameNumber, nameEndNumber, endNumber, name, filename, userInclude, true);
fDirectives.add(inclusionStatement);
fCurrentContext= new FileLocationCtx(fCurrentContext, filename, buffer, startOffset, endOffset, endNumber, inclusionStatement);
fCurrentContext= new FileLocationCtx((ContainerLocationCtx) fCurrentContext, filename, buffer, startOffset, endOffset, endNumber, inclusionStatement);
fLastChildInsertionOffset= 0;
return fCurrentContext;
}
@ -145,6 +147,8 @@ public class LocationMap implements ILocationResolver {
*/
public ILocationCtx pushMacroExpansion(int startOffset, int nameOffset, int nameEndOffset, int endOffset, int contextLength,
IPreprocessorMacro macro, IASTName[] implicitMacroReferences, ImageLocationInfo[] imageLocations) {
assert fCurrentContext instanceof ContainerLocationCtx;
int startNumber= getSequenceNumberForOffset(startOffset);
int nameNumber= getSequenceNumberForOffset(nameOffset);
int nameEndNumber= getSequenceNumberForOffset(nameEndOffset);
@ -160,7 +164,7 @@ public class LocationMap implements ILocationResolver {
nameNumber, nameEndNumber, macro.getNameCharArray(), macro);
addExpansion(macro, expansion);
fCurrentContext= new MacroExpansionCtx(fCurrentContext, startOffset, endOffset, endNumber, contextLength, imageLocations, expansion);
fCurrentContext= new MacroExpansionCtx((ContainerLocationCtx) fCurrentContext, startOffset, endOffset, endNumber, contextLength, imageLocations, expansion);
fLastChildInsertionOffset= 0;
return fCurrentContext;
}
@ -218,7 +222,7 @@ public class LocationMap implements ILocationResolver {
public void encounterProblem(int id, char[] arg, int offset, int endOffset) {
offset= getSequenceNumberForOffset(offset);
endOffset= getSequenceNumberForOffset(endOffset);
ASTProblem problem = new ASTProblem(id, arg, offset, endOffset);
ASTProblem problem = new ASTProblem(fTranslationUnit, id, arg, offset, endOffset);
fProblems.add(problem);
}
@ -298,12 +302,12 @@ public class LocationMap implements ILocationResolver {
fDirectives.add(astMacro);
}
public void encounterPoundUndef(PreprocessorMacro definition, int startOffset, int nameOffset, int nameEndOffset, int endOffset, char[] name) {
public void encounterPoundUndef(IMacroBinding definition, int startOffset, int nameOffset, int nameEndOffset, int endOffset, char[] name) {
startOffset= getSequenceNumberForOffset(startOffset);
nameOffset= getSequenceNumberForOffset(nameOffset);
nameEndOffset= getSequenceNumberForOffset(nameEndOffset);
endOffset= getSequenceNumberForOffset(endOffset);
fDirectives.add(new ASTUndef(fTranslationUnit, name, startOffset, nameOffset, nameEndOffset, endOffset));
fDirectives.add(new ASTUndef(fTranslationUnit, name, startOffset, nameOffset, nameEndOffset, endOffset, definition));
}
public void setRootNode(IASTTranslationUnit root) {
@ -340,12 +344,12 @@ public class LocationMap implements ILocationResolver {
}
public String getContainingFilename(int sequenceNumber) {
LocationCtx ctx= fRootContext.findContextForSequenceNumberRange(sequenceNumber, 1);
LocationCtx ctx= fRootContext.ctxForNumberRange(sequenceNumber, 1);
return new String(ctx.getFilename());
}
public IASTFileLocation getMappedFileLocation(int sequenceNumber, int length) {
return fRootContext.getFileLocationForSequenceNumberRange(sequenceNumber, length);
return fRootContext.fileLocationForNumberRange(sequenceNumber, length);
}
public IASTPreprocessorMacroDefinition[] getMacroDefinitions() {
@ -370,6 +374,10 @@ public class LocationMap implements ILocationResolver {
return (IASTPreprocessorIncludeStatement[]) result.toArray(new IASTPreprocessorIncludeStatement[result.size()]);
}
public IASTComment[] getComments() {
return (IASTComment[]) fComments.toArray(new IASTComment[fComments.size()]);
}
public IASTPreprocessorStatement[] getAllPreprocessorStatements() {
return (IASTPreprocessorStatement[]) fDirectives.toArray(new IASTPreprocessorStatement[fDirectives.size()]);
}
@ -417,16 +425,31 @@ public class LocationMap implements ILocationResolver {
public void cleanup() {
throw new UnsupportedOperationException();
}
public IASTFileLocation flattenLocations(IASTNodeLocation[] nodeLocations) {
throw new UnsupportedOperationException();
// mstodo get rid of IASTNodeLocation
public IASTFileLocation flattenLocations(IASTNodeLocation[] locations) {
if (locations.length != 1 || !(locations[0] instanceof IASTFileLocation)) {
throw new IllegalArgumentException();
}
return (IASTFileLocation) locations[0];
}
// mstodo get rid of IASTNodeLocation
public IASTNodeLocation[] getLocations(int offset, int length) {
throw new UnsupportedOperationException();
return new IASTNodeLocation[] {getMappedFileLocation(offset, length)};
}
public ASTPreprocessorSelectionResult getPreprocessorNode(String path, int offset, int length) {
throw new UnsupportedOperationException();
}
// mstodo get rid of IASTNodeLocation
public char[] getUnpreprocessedSignature(IASTNodeLocation[] locations) {
throw new UnsupportedOperationException();
switch(locations.length) {
case 0: return CharArrayUtils.EMPTY;
case 1: break;
default: throw new IllegalArgumentException();
}
if (!(locations[0] instanceof ASTFileLocation)) {
throw new IllegalArgumentException();
}
ASTFileLocation floc= (ASTFileLocation) locations[0];
return floc.getSource();
}
}

View file

@ -47,6 +47,10 @@ abstract class PreprocessorMacro implements IPreprocessorMacro {
return false;
}
public char[][] getParameterList() {
return null;
}
public Object getAdapter(Class clazz) {
return null;
}
@ -121,7 +125,7 @@ class FunctionStyleMacro extends ObjectStyleMacro {
fHasVarArgs= hasVarArgs;
}
public char[][] getParamList() {
public char[][] getParameterList() {
return fParamList;
}

View file

@ -62,4 +62,11 @@ public class MacroBinding extends PlatformObject implements IMacroBinding {
public boolean isFunctionStyle() {
return definition instanceof _FunctionMacroDefinition;
}
public char[][] getParameterList() {
if (isFunctionStyle()) {
return ((_FunctionMacroDefinition) definition).getParms();
}
return null;
}
}