From dc228062598a33014201f6e29123346c86b43118 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 19 Jul 2005 00:46:37 +0000 Subject: [PATCH] Fixed Bug 103560 ClassCastException in LocationMap.endInclusion --- .../core/parser/scanner2/DOMScanner.java | 8 +-- .../scanner2/IScannerPreprocessorLog.java | 6 +- .../core/parser/scanner2/LocationMap.java | 68 ++++++++++++++++--- 3 files changed, 66 insertions(+), 16 deletions(-) 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 f0a86ab191e..91e06962178 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 @@ -250,7 +250,7 @@ public class DOMScanner extends BaseScanner { else { bufferDelta[0] += bufferDelta[bufferStackPos + 1] + ((CodeReader) result).buffer.length; - locationMap.endInclusion( getGlobalCounter(0) ); + locationMap.endInclusion( ((CodeReader) result), getGlobalCounter(0) ); } } else if (result instanceof InclusionData) { @@ -262,7 +262,7 @@ public class DOMScanner extends BaseScanner { } int value = getGlobalCounter(bufferStackPos + 1) + delta_pos; - locationMap.endInclusion(value); + locationMap.endInclusion(codeReader, value); bufferDelta[bufferStackPos] += bufferDelta[bufferStackPos + 1] + codeReader.buffer.length; } else if (result instanceof MacroData) { @@ -270,7 +270,7 @@ public class DOMScanner extends BaseScanner { if (data.macro instanceof FunctionStyleMacro && fsmCount == 0) { locationMap - .endFunctionStyleExpansion(getGlobalCounter(bufferStackPos + 1) + .endFunctionStyleExpansion(((FunctionStyleMacro)data.macro).attachment, getGlobalCounter(bufferStackPos + 1) + delta_pos + 1); // functionstyle // macro) // ; @@ -278,7 +278,7 @@ public class DOMScanner extends BaseScanner { + delta_pos + 1; } else if (data.macro instanceof ObjectStyleMacro && fsmCount == 0) { locationMap - .endObjectStyleMacroExpansion(getGlobalCounter(bufferStackPos + 1) + .endObjectStyleMacroExpansion(((ObjectStyleMacro)data.macro).attachment, getGlobalCounter(bufferStackPos + 1) + delta_pos ); bufferDelta[bufferStackPos] += bufferDelta[bufferStackPos + 1] + delta_pos; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java index 97a870b600a..75ed7e7801a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/IScannerPreprocessorLog.java @@ -25,18 +25,18 @@ public interface IScannerPreprocessorLog { public void startInclusion(CodeReader reader, int offset, int endOffset); - public void endInclusion(int offset); + public void endInclusion(CodeReader reader, int offset); public void startObjectStyleMacroExpansion(IMacroDefinition macro, int startOffset, int endOffset); - public void endObjectStyleMacroExpansion(int offset); + public void endObjectStyleMacroExpansion(IMacroDefinition macro, int offset); public void startFunctionStyleExpansion(IMacroDefinition macro, char[][] parameters, int startOffset, int endOffset); - public void endFunctionStyleExpansion(int offset); + public void endFunctionStyleExpansion(IMacroDefinition macro, int offset); public interface IMacroDefinition { public char[] getName(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index f13ae0d77a0..c0609d54057 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -1862,9 +1862,27 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#endInclusion(char[], * int) */ - public void endInclusion(int offset) { - ((_Inclusion) currentContext).context_ends = offset; - currentContext = currentContext.getParent(); + public void endInclusion(CodeReader reader, int offset) { + if( currentContext instanceof _Inclusion && + ((_Inclusion)currentContext).reader == reader ) + { + ((_Inclusion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + + _CompositeContext test = currentContext; + while( ( test = test.getParent() ) != tu ) + { + if( test instanceof _Inclusion && + ((_Inclusion)test).reader == reader ) + { + currentContext = test; + ((_Inclusion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + } } /* @@ -1887,9 +1905,25 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#exitObjectStyleMacroExpansion(char[], * int) */ - public void endObjectStyleMacroExpansion(int offset) { - ((_ObjectMacroExpansion) currentContext).context_ends = offset; - currentContext = currentContext.getParent(); + public void endObjectStyleMacroExpansion(IMacroDefinition macro, int offset) { + if( currentContext instanceof _MacroExpansion && ((_MacroExpansion)currentContext).definition == macro ) + { + ((_ObjectMacroExpansion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + + _CompositeContext test = currentContext; + while( ( test = test.getParent() ) != tu ) + { + if( test instanceof _MacroExpansion && ((_MacroExpansion)test).definition == macro ) + { + currentContext = test; + ((_ObjectMacroExpansion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + } } /* @@ -1912,9 +1946,25 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { * @see org.eclipse.cdt.internal.core.parser.scanner2.IScannerPreprocessorLog#exitFunctionStyleExpansion(char[], * int) */ - public void endFunctionStyleExpansion(int offset) { - ((_FunctionMacroExpansion) currentContext).context_ends = offset; - currentContext = currentContext.getParent(); + public void endFunctionStyleExpansion(IMacroDefinition macro, int offset) { + if( currentContext instanceof _MacroExpansion && ((_MacroExpansion)currentContext).definition == macro ) + { + ((_FunctionMacroExpansion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + + _CompositeContext test = currentContext; + while( ( test = test.getParent() ) != tu ) + { + if( test instanceof _MacroExpansion && ((_MacroExpansion)test).definition == macro ) + { + currentContext = test; + ((_FunctionMacroExpansion) currentContext).context_ends = offset; + currentContext = currentContext.getParent(); + return; + } + } } /*