/******************************************************************************* * Copyright (c) 2007, 2009 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.IASTPreprocessorMacroExpansion; 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.IASTTranslationUnit.IDependencyTree; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode; 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.CharArray; import org.eclipse.cdt.internal.core.parser.scanner.ILocationCtx; import org.eclipse.cdt.internal.core.parser.scanner.ImageLocationInfo; import org.eclipse.cdt.internal.core.parser.scanner.Lexer.LexerOptions; import org.eclipse.cdt.internal.core.parser.scanner.LocationMap; public class LocationMapTests extends BaseTestCase { public class Loc implements IASTFileLocation { private String fFile; private int fOffset; private int fEndOffset; public Loc(String file, int offset, int endOffset) { fFile= file; fOffset= offset; fEndOffset= endOffset; } public int getEndingLineNumber() { return 0; } public String getFileName() { return fFile; } public int getNodeLength() { return fEndOffset-fOffset; } public int getNodeOffset() { return fOffset; } public int getStartingLineNumber() { return 0; } public IASTFileLocation asFileLocation() { return this; } public IASTPreprocessorIncludeStatement getContextInclusionStatement() { return null; } } 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 int ROLE_REFERENCE = IASTNameOwner.r_reference; private static final ASTNodeProperty PROP_PST = IASTTranslationUnit.PREPROCESSOR_STATEMENT; final static char[] DIGITS= "0123456789abcdef".toCharArray(); final static char[] LONGDIGITS= new char[1024]; static { for (int i = 0; i < LONGDIGITS.length; i++) { LONGDIGITS[i]= (char) i; } } private LocationMap fLocationMap; private CPPASTTranslationUnit fTu; public static TestSuite suite() { return suite(LocationMapTests.class); } @Override protected void setUp() throws Exception { super.setUp(); fLocationMap= new LocationMap(new LexerOptions()); } @Override protected void tearDown() throws Exception { fLocationMap= null; super.tearDown(); } protected StringBuilder[] getContents(int sections) throws IOException { return TestSourceReader.getContentsForTest( CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections); } private void init(char[] content) { fLocationMap.pushTranslationUnit(FN, new CharArray(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()); assertEquals(filename, node.getContainingFilename()); if (offset >= 0) { IASTFileLocation loc= node.getFileLocation(); checkLocation(loc, filename, offset, length, line, endline); assertEquals(sig, node.getRawSignature()); } else { assertNull(node.getFileLocation()); } } 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.CPP_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) { if (loc == null) { assertEquals(0, offset); assertEquals(0, length); } else { 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()); if (arg != null) { assertEquals(arg, problem.getArguments()[0]); } 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, IMacroBinding 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); } } IASTName[] decls= fLocationMap.getDeclarations(binding); assertEquals(1, decls.length); assertSame(macro.getName(), decls[0]); } 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, IASTPreprocessorStatement.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, null, "", 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], "012", "12", FN,0,3,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], "012", "12", FN,0,3,1); } public void testIncludes() { init(DIGITS); fLocationMap.encounterPoundInclude(0, 0, 0, 0, "n1".toCharArray(), null, true, false, false, null); fLocationMap.encounterPoundInclude(0, 1, 3, 16, "n2".toCharArray(), "f2", false , true, false, null); 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, IASTName.EMPTY_NAME_ARRAY); fLocationMap.encounterPoundIf(0, 1, 3, 16, true, IASTName.EMPTY_NAME_ARRAY); IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements(); assertEquals(2, prep.length); checkIf(prep[0], "", "", false, FN, 0, 0, 1); checkIf(prep[1], "012", "12", true, FN, 0, 3, 1); } public void testIfdef() { init(DIGITS); fLocationMap.encounterPoundIfdef(0, 0, 0, 0, false, null); fLocationMap.encounterPoundIfdef(0, 1, 3, 16, true, null); IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements(); assertEquals(2, prep.length); checkIfdef(prep[0], "", "", false, FN, 0, 0, 1); checkIfdef(prep[1], "012", "12", true, FN, 0, 3, 1); } public void testIfndef() { init(DIGITS); fLocationMap.encounterPoundIfndef(0, 0, 0, 0, false, null); fLocationMap.encounterPoundIfndef(0, 1, 3, 16, true, null); IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements(); assertEquals(2, prep.length); checkIfndef(prep[0], "", "", false, FN, 0, 0, 1); checkIfndef(prep[1], "012", "12", true, FN, 0, 3, 1); } public void testElif() { init(DIGITS); fLocationMap.encounterPoundElif(0, 0, 0, 0, false, IASTName.EMPTY_NAME_ARRAY); fLocationMap.encounterPoundElif(0, 1, 3, 16, true, IASTName.EMPTY_NAME_ARRAY); IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements(); assertEquals(2, prep.length); checkElif(prep[0], "", "", false, FN, 0, 0, 1); checkElif(prep[1], "012", "12", true, FN, 0, 3, 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, true, macro1); fLocationMap.encounterPoundDefine(0, 1, 3, 10, 16, true, 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, "", -1, 0, 0, -1, 0); checkMacroDefinition(prep[1], macro2, "", "n2", "n2", "exp2", params, "", -1, 0, 0, -1, 0); } public void testIndexDefine() { IMacroBinding macro1= new TestMacro("n1", "exp1", null); final String[] params = new String[]{"p1", "p2"}; IMacroBinding macro2= new TestMacro("n2", "exp2", params); init(DIGITS); fLocationMap.registerMacroFromIndex(macro1, new Loc("fidx1", 0, 0), 0); fLocationMap.registerMacroFromIndex(macro2, new Loc("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() { IMacroBinding macro1= new TestMacro("n1", "exp1", null); init(DIGITS); fLocationMap.encounterPoundUndef(null, 0, 0, 0, 0, "n1".toCharArray(), true); fLocationMap.encounterPoundUndef(macro1, 0, 3, 7, 16, "n2".toCharArray(), true); IASTPreprocessorStatement[] prep= fLocationMap.getAllPreprocessorStatements(); assertEquals(2, prep.length); checkMacroUndef(prep[0], null, "", "n1", "", FN, 0, 0, 1, 0, 0); checkMacroUndef(prep[1], macro1, "0123456", "n2", "3456", FN, 0, 7, 1, 3, 4); } public void testMacroExpansion() { IMacroBinding macro1= new TestMacro("n1", "exp1", null); IMacroBinding macro2= new TestMacro("n2", "exp2", null); IMacroBinding macro3= new TestMacro("n3", "exp3", null); init(LONGDIGITS); assertEquals(1, fLocationMap.getCurrentLineNumber('\n')); assertEquals(2, fLocationMap.getCurrentLineNumber('\n'+1)); fLocationMap.registerPredefinedMacro(macro1); fLocationMap.registerMacroFromIndex(macro2, new Loc("ifile", 2, 12), 32); fLocationMap.encounterPoundDefine(3, 13, 33, 63, 103, true, macro3); IASTName name1= fLocationMap.encounterImplicitMacroExpansion(macro1, null); IASTName name2= fLocationMap.encounterImplicitMacroExpansion(macro2, null); fLocationMap.pushMacroExpansion(110, 115, 125, 30, macro3, new IASTName[]{name1, name2}, new ImageLocationInfo[0]); fLocationMap.encounteredComment(12, 23, false); checkComment(fLocationMap.getComments()[0], new String(LONGDIGITS, 110, 15), false, FN, 110, 15, 2, 2); IASTName[] refs= fLocationMap.getReferences(macro3); assertEquals(1, refs.length); IASTName macro3ref= refs[0]; checkName(refs[0], macro3, "n3", refs[0].getParent(), IASTPreprocessorMacroExpansion.EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 5, 2, 2, new String(LONGDIGITS, 110, 5)); refs= fLocationMap.getReferences(macro1); assertEquals(1, refs.length); checkName(refs[0], macro1, "n1", refs[0].getParent(), IASTPreprocessorMacroExpansion.NESTED_EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 15, 2, 2, new String(LONGDIGITS, 110, 15)); refs= fLocationMap.getReferences(macro2); assertEquals(1, refs.length); checkName(refs[0], macro2, "n2", refs[0].getParent(), IASTPreprocessorMacroExpansion.NESTED_EXPANSION_NAME, ROLE_REFERENCE, FN, 110, 15, 2, 2, new String(LONGDIGITS, 110, 15)); } public void testContexts() { init(DIGITS); assertEquals(FN, fLocationMap.getTranslationUnitPath()); assertEquals(FN, fLocationMap.getCurrentFilePath()); // number: [30,36)[46,50) ILocationCtx pre1= fLocationMap.pushPreInclusion(new CharArray("0102030405"), 0, false); assertEquals(FN, fLocationMap.getCurrentFilePath()); // number: [0,6)[26,30) ILocationCtx pre2= fLocationMap.pushPreInclusion(new CharArray("a1a2a3a4a5"), 0, true); assertEquals(FN, fLocationMap.getCurrentFilePath()); fLocationMap.encounteredComment(0,2,true); // number: [6,15)[25,26) ILocationCtx i1= fLocationMap.pushInclusion(0, 2, 4, 6, new CharArray("b1b2b3b4b5"), "pre1", "pre1".toCharArray(), false, false, false); assertEquals("pre1", fLocationMap.getCurrentFilePath()); fLocationMap.encounteredComment(2,4,true); // number: [15,25) ILocationCtx i2= fLocationMap.pushInclusion(6, 7, 8, 9, new CharArray("c1c2c3c4c5"), "pre11", "pre11".toCharArray(), false, false, false); assertEquals("pre11", fLocationMap.getCurrentFilePath()); fLocationMap.encounteredComment(2,6,true); fLocationMap.popContext(i2); // add a comment before the include fLocationMap.encounteredComment(4,6,false); assertEquals("pre1", fLocationMap.getCurrentFilePath()); fLocationMap.popContext(i1); assertEquals(FN, fLocationMap.getCurrentFilePath()); fLocationMap.popContext(pre2); assertEquals(FN, fLocationMap.getCurrentFilePath()); // number [36, 46) ILocationCtx i3= fLocationMap.pushInclusion(0, 2, 4, 6, new CharArray("d1d2d3d4d5"), "pre2", "pre2".toCharArray(), false, false, false); assertEquals("pre2", fLocationMap.getCurrentFilePath()); fLocationMap.encounteredComment(0,2,true); fLocationMap.popContext(i3); fLocationMap.popContext(pre1); assertEquals(FN, fLocationMap.getCurrentFilePath()); 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); checkLocation(fLocationMap.getMappedFileLocation(0, 7), FN, 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(6, 10), "pre1", 0, 9, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(6, 20), "pre1", 0, 10, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(15, 11), "pre1", 6, 4, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(25, 2), FN, 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(26, 5), FN, 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(30, 7), FN, 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(36, 11), FN, 0, 0, 1, 1); checkLocation(fLocationMap.getMappedFileLocation(46, 5), FN, 0, 1, 1, 1); IDependencyTree tree= fLocationMap.getDependencyTree(); assertEquals(FN, tree.getTranslationUnitPath()); IASTInclusionNode[] inclusions= tree.getInclusions(); assertEquals(2, inclusions.length); checkInclude(inclusions[0].getIncludeDirective(), "", "", "pre1", "pre1", false, true, FN, 0, 0, 1, 0, 0); checkInclude(inclusions[1].getIncludeDirective(), "", "", "pre2", "pre2", false, true, FN, 0, 0, 1, 0, 0); assertEquals(0, inclusions[1].getNestedInclusions().length); inclusions= inclusions[0].getNestedInclusions(); assertEquals(1, inclusions.length); checkInclude(inclusions[0].getIncludeDirective(), "b4b", "4", "pre11", "pre11", false, true, "pre1", 6, 3, 1, 7, 1); assertEquals(0, inclusions[0].getNestedInclusions().length); } }