1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 14:12:10 +02:00

Fixed Bug 87894 - [Offset] example from windows.h generates weird AST in DOM View

This commit is contained in:
John Camelon 2005-04-06 19:24:37 +00:00
parent 573d7a0dff
commit e83f41c613
5 changed files with 40 additions and 56 deletions

View file

@ -21,11 +21,15 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorEndifStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IParserLogService;
import org.eclipse.cdt.core.parser.IScanner;
@ -305,40 +309,8 @@ public class DOMLocationInclusionTests extends FileBasePluginTest {
assertSoleFileLocation(
macroDefinitions[5],
"blarg.c", c_file_code.indexOf("#define POST_SECOND"), "#define POST_SECOND".length()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
}
public void testBug87894() throws Exception {
StringBuffer fakeBuffer = new StringBuffer( "// windows_fake.h:\n" ); //$NON-NLS-1$
fakeBuffer.append( "#ifdef RC_INVOKED\n" ); //$NON-NLS-1$
fakeBuffer.append( "#define WIN32_LEAN_AND_MEAN\n" ); //$NON-NLS-1$
fakeBuffer.append( "#endif\n" ); //$NON-NLS-1$
fakeBuffer.append( "\n" ); //$NON-NLS-1$
fakeBuffer.append( "#ifndef WIN32_LEAN_AND_MEAN\n" ); //$NON-NLS-1$
fakeBuffer.append( "#include \"rpc_fake.h\"\n" ); //$NON-NLS-1$
fakeBuffer.append( "#endif)\n" ); //$NON-NLS-1$
String windows_fake_h_code = fakeBuffer.toString();
importFile( "windows_fake.h", windows_fake_h_code ); //$NON-NLS-1$
StringBuffer rpcBuffer = new StringBuffer();
rpcBuffer.append( "// rpc_fake.h:\n" ); //$NON-NLS-1$
rpcBuffer.append( "#define RC_INVOKED\n" ); //$NON-NLS-1$
rpcBuffer.append( "\n" ); //$NON-NLS-1$
rpcBuffer.append( "#ifndef RPC_NO_WINDOWS_H\n" ); //$NON-NLS-1$
rpcBuffer.append( "#include \"windows_fake.h\"\n" ); //$NON-NLS-1$
rpcBuffer.append( "#endif\n" ); //$NON-NLS-1$
String rpc_fake_h_code = rpcBuffer.toString();
importFile( "rpc_fake.h", rpc_fake_h_code ); //$NON-NLS-1$
String test_c_code = "// test.c:\n#include \"windows_fake.h\"\n // endOffset is 64 but should be more like 266"; //$NON-NLS-1$
IFile f = importFile( "test.c", test_c_code ); //$NON-NLS-1$
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
: null) {
IASTTranslationUnit tu = parse(f, p); //$NON-NLS-1$
}
}
public static Test suite() {

View file

@ -1344,24 +1344,7 @@ abstract class BaseScanner implements IScanner {
protected void pushContext(char[] buffer, Object data) {
if (data instanceof InclusionData) {
boolean isCircular = false;
for (int i = 0; i < bufferStackPos; ++i) {
if (bufferData[i] instanceof CodeReader
&& CharArrayUtils.equals(
((CodeReader) bufferData[i]).filename,
((InclusionData) data).reader.filename)) {
isCircular = true;
break;
} else if (bufferData[i] instanceof InclusionData
&& CharArrayUtils
.equals(
((InclusionData) bufferData[i]).reader.filename,
((InclusionData) data).reader.filename)) {
isCircular = true;
break;
}
}
if (isCircular)
if (isCircularInclusion( (InclusionData)data ))
return;
}
pushContext(buffer);
@ -1369,6 +1352,24 @@ abstract class BaseScanner implements IScanner {
}
protected boolean isCircularInclusion(InclusionData data) {
for (int i = 0; i < bufferStackPos; ++i) {
if (bufferData[i] instanceof CodeReader
&& CharArrayUtils.equals(
((CodeReader) bufferData[i]).filename,
data.reader.filename)) {
return true;
} else if (bufferData[i] instanceof InclusionData
&& CharArrayUtils
.equals(
((InclusionData) bufferData[i]).reader.filename,
data.reader.filename)) {
return true;
}
}
return false;
}
protected Object popContext() {
//NOTE - do not set counters to 0 or -1 or something
//Subclasses may require those values in their popContext()

View file

@ -187,11 +187,13 @@ public class DOMScanner extends BaseScanner {
b.append(((InclusionData) data).reader.filename);
log.traceLog(b.toString());
}
DOMInclusion inc = ((DOMInclusion) ((InclusionData) data).inclusion);
locationMap.startInclusion(((InclusionData) data).reader, inc.o,
resolveOffset(getCurrentOffset()));
bufferDelta[bufferStackPos + 1] = 0;
if( ! isCircularInclusion( (InclusionData) data ))
{
DOMInclusion inc = ((DOMInclusion) ((InclusionData) data).inclusion);
locationMap.startInclusion(((InclusionData) data).reader, inc.o,
resolveOffset(getCurrentOffset()));
bufferDelta[bufferStackPos + 1] = 0;
}
}
else if (data instanceof MacroData) {

View file

@ -37,4 +37,8 @@ public class InclusionNode implements IASTInclusionNode, IDependencyNodeHost {
incs = (IASTInclusionNode[]) ArrayUtil.append( IASTInclusionNode.class, incs, node );
}
public String toString() {
return stmt.toString();
}
}

View file

@ -458,6 +458,11 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
return new String(path);
}
public String toString() {
return getPath();
}
}
/**