1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-20 07:25:23 +02:00

More tracing options for the indexer, combined 3 parallel IASTProblem implementations, related to bug 213561.

This commit is contained in:
Markus Schorn 2008-02-15 10:41:30 +00:00
parent 8f9be92af5
commit 7f2fe153bd
36 changed files with 724 additions and 936 deletions

View file

@ -32,7 +32,7 @@ public class PreprocessorBugsTests extends PreprocessorTestsBase {
public void testMacroInInclusion_Bug122891() throws Exception { public void testMacroInInclusion_Bug122891() throws Exception {
initializeScanner(); initializeScanner();
validateEOF(); validateEOF();
validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "regxag4.sfr"); validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "<regxag4.sfr>");
validateProblemCount(1); validateProblemCount(1);
} }
@ -63,7 +63,7 @@ public class PreprocessorBugsTests extends PreprocessorTestsBase {
public void testEmptyStringInMacroInInclusion_Bug145270() throws Exception { public void testEmptyStringInMacroInInclusion_Bug145270() throws Exception {
initializeScanner(); initializeScanner();
validateEOF(); validateEOF();
validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "bar.h"); validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "\"bar.h\"");
validateProblemCount(1); validateProblemCount(1);
} }

View file

@ -30,7 +30,16 @@ org.eclipse.cdt.core/debug/indexer/activity=false
# Reports statistics for indexer # Reports statistics for indexer
org.eclipse.cdt.core/debug/indexer/statistics=false org.eclipse.cdt.core/debug/indexer/statistics=false
# Reports problems for indexer # Reports unresolved inclusions for indexer
org.eclipse.cdt.core/debug/indexer/problems/inclusion=false
# Reports scanner-problems for indexer (other than unresolved includes)
org.eclipse.cdt.core/debug/indexer/problems/scanner=false
# Reports syntax-problems for indexer
org.eclipse.cdt.core/debug/indexer/problems/syntax=false
# Reports problems for indexer, including inclusion-, scanner-, syntax- and resolution-problems.
org.eclipse.cdt.core/debug/indexer/problems=false org.eclipse.cdt.core/debug/indexer/problems=false
# Code formatter debugging # Code formatter debugging

View file

@ -130,7 +130,7 @@ public class CModelBuilder2 implements IContributedModelBuilder {
* @see org.eclipse.cdt.core.parser.IProblem#getMessage() * @see org.eclipse.cdt.core.parser.IProblem#getMessage()
*/ */
public String getMessage() { public String getMessage() {
return fASTProblem.getMessage(); return fASTProblem.getMessageWithoutLocation();
} }
/* /*

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2007 QNX Software Systems * Copyright (c) 2005, 2008 QNX Software Systems
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -23,6 +23,9 @@ import org.eclipse.core.runtime.IProgressMonitor;
public interface IPDOMIndexerTask { public interface IPDOMIndexerTask {
public static final String TRACE_ACTIVITY = CCorePlugin.PLUGIN_ID + "/debug/indexer/activity"; //$NON-NLS-1$ public static final String TRACE_ACTIVITY = CCorePlugin.PLUGIN_ID + "/debug/indexer/activity"; //$NON-NLS-1$
public static final String TRACE_STATISTICS = CCorePlugin.PLUGIN_ID + "/debug/indexer/statistics"; //$NON-NLS-1$ public static final String TRACE_STATISTICS = CCorePlugin.PLUGIN_ID + "/debug/indexer/statistics"; //$NON-NLS-1$
public static final String TRACE_INCLUSION_PROBLEMS = CCorePlugin.PLUGIN_ID + "/debug/indexer/problems/inclusion"; //$NON-NLS-1$
public static final String TRACE_SCANNER_PROBLEMS = CCorePlugin.PLUGIN_ID + "/debug/indexer/problems/scanner"; //$NON-NLS-1$
public static final String TRACE_SYNTAX_PROBLEMS = CCorePlugin.PLUGIN_ID + "/debug/indexer/problems/syntax"; //$NON-NLS-1$
public static final String TRACE_PROBLEMS = CCorePlugin.PLUGIN_ID + "/debug/indexer/problems"; //$NON-NLS-1$ public static final String TRACE_PROBLEMS = CCorePlugin.PLUGIN_ID + "/debug/indexer/problems"; //$NON-NLS-1$
/** /**

View file

@ -1,12 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast; package org.eclipse.cdt.core.dom.ast;
@ -38,13 +39,19 @@ public interface IASTProblem extends IASTNode {
/** /**
* Answer a localized, human-readable message string which describes the * Answer a localized, human-readable message string which describes the
* problem. * problem including its location
* *
* @return a localized, human-readable message string which describes the * @return a localized, human-readable message string which describes the
* problem * problem
*/ */
String getMessage(); String getMessage();
/**
* Returns a human-readable message string describing the problem, without
* location information.
*/
String getMessageWithoutLocation();
/** /**
* Return to the client a map between parameter names and values. * Return to the client a map between parameter names and values.
* *

View file

@ -163,6 +163,11 @@ public interface IASTTranslationUnit extends IASTNode, IAdaptable {
*/ */
public IASTProblem[] getPreprocessorProblems(); public IASTProblem[] getPreprocessorProblems();
/**
* Fast access to the count of preprocessor problems to support statistics.
*/
public int getPreprocessorProblemsCount();
/** /**
* Get the translation unit's full path. * Get the translation unit's full path.
* @return String representation of path. * @return String representation of path.

View file

@ -0,0 +1,165 @@
/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation 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
* Anton Leherbauer (Wind River Systems)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.internal.core.parser.ParserMessages;
/**
* Models problems, all problems should derive from this class.
*/
public class ASTProblem extends ASTNode implements IASTProblem {
private final int id;
private final char[] arg;
private boolean isError= false;
public ASTProblem(IASTNode parent, ASTNodeProperty property, int id, char[] arg, boolean isError, int startNumber, int endNumber) {
setParent(parent);
setPropertyInParent(property);
setOffset(startNumber);
setLength(endNumber-startNumber);
this.isError= isError;
this.id = id;
this.arg = arg;
}
public ASTProblem(int id, char[] arg, boolean isError) {
this.id = id;
this.arg = arg;
this.isError= isError;
}
public int getID() {
return id;
}
public boolean isError() {
return isError;
}
public boolean isWarning() {
return !isError;
}
public String getMessage() {
String msg= getMessageWithoutLocation();
IASTFileLocation f = getFileLocation();
String file = null;
int line = 0;
if( f == null )
{
file = ""; //$NON-NLS-1$
} else {
file = f.getFileName();
line = f.getStartingLineNumber();
}
Object[] args = new Object[] { msg, file, new Integer(line) };
return ParserMessages.getFormattedString(PROBLEM_PATTERN, args);
}
public String getMessageWithoutLocation() {
String msg = errorMessages.get(new Integer(id));
if (msg == null)
msg = ""; //$NON-NLS-1$
if (arg != null) {
return MessageFormat.format(msg, new Object[] { new String(arg) });
}
return msg;
}
public boolean checkCategory(int bitmask) {
return ((id & bitmask) != 0);
}
public String getArguments() {
return arg != null ? String.valueOf(arg) : ""; //$NON-NLS-1$
}
protected static final Map<Integer, String> errorMessages;
static {
errorMessages = new HashMap<Integer, String>();
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_POUND_ERROR),
ParserMessages.getString("ScannerProblemFactory.error.preproc.error")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_POUND_WARNING),
ParserMessages.getString("ScannerProblemFactory.error.preproc.warning")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND),
ParserMessages.getString("ScannerProblemFactory.error.preproc.inclusionNotFound")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_DEFINITION_NOT_FOUND),
ParserMessages.getString("ScannerProblemFactory.error.preproc.definitionNotFound")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_DEFN),
ParserMessages.getString("ScannerProblemFactory.error.preproc.invalidMacroDefn")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_REDEFN),
ParserMessages.getString("ScannerProblemFactory.error.preproc.invalidMacroRedefn")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_UNBALANCE_CONDITION),
ParserMessages.getString("ScannerProblemFactory.error.preproc.unbalancedConditional")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_CONDITIONAL_EVAL_ERROR),
ParserMessages.getString("ScannerProblemFactory.error.preproc.conditionalEval")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_MACRO_USAGE_ERROR),
ParserMessages.getString("ScannerProblemFactory.error.preproc.macroUsage")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_CIRCULAR_INCLUSION),
ParserMessages.getString("ScannerProblemFactory.error.preproc.circularInclusion")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_INVALID_DIRECTIVE),
ParserMessages.getString("ScannerProblemFactory.error.preproc.invalidDirective")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_MACRO_PASTING_ERROR),
ParserMessages.getString("ScannerProblemFactory.error.preproc.macroPasting")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_MISSING_RPAREN_PARMLIST),
ParserMessages.getString("ScannerProblemFactory.error.preproc.missingRParen")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_INVALID_VA_ARGS),
ParserMessages.getString("ScannerProblemFactory.error.preproc.invalidVaArgs")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_INVALID_ESCAPECHAR),
ParserMessages.getString("ScannerProblemFactory.error.scanner.invalidEscapeChar")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_UNBOUNDED_STRING),
ParserMessages.getString("ScannerProblemFactory.error.scanner.unboundedString")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_FLOATING_POINT),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badFloatingPoint")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_HEX_FORMAT),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badHexFormat")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_OCTAL_FORMAT),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badOctalFormat")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_DECIMAL_FORMAT),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badDecimalFormat")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_ASSIGNMENT_NOT_ALLOWED),
ParserMessages.getString("ScannerProblemFactory.error.scanner.assignmentNotAllowed")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_DIVIDE_BY_ZERO),
ParserMessages.getString("ScannerProblemFactory.error.scanner.divideByZero")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_MISSING_R_PAREN),
ParserMessages.getString("ScannerProblemFactory.error.scanner.missingRParen")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_EXPRESSION_SYNTAX_ERROR),
ParserMessages.getString("ScannerProblemFactory.error.scanner.expressionSyntaxError")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_ILLEGAL_IDENTIFIER),
ParserMessages.getString("ScannerProblemFactory.error.scanner.illegalIdentifier")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_CONDITIONAL_EXPRESSION),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badConditionalExpression")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_UNEXPECTED_EOF),
ParserMessages.getString("ScannerProblemFactory.error.scanner.unexpectedEOF")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SCANNER_BAD_CHARACTER),
ParserMessages.getString("ScannerProblemFactory.error.scanner.badCharacter")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SYNTAX_ERROR),
ParserMessages.getString("ParserProblemFactory.error.syntax.syntaxError")); //$NON-NLS-1$
}
protected final static String PROBLEM_PATTERN = "BaseProblemFactory.problemPattern"; //$NON-NLS-1$
}

View file

@ -1,265 +1,32 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research) * Yuan Zhang / Beth Tibbitts (IBM Research)
* Anton Leherbauer (Wind River Systems) * Anton Leherbauer (Wind River Systems)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.internal.core.dom.parser.ASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.internal.core.parser.ParserMessages;
/** /**
* @author jcamelon * C-specific implementation of ASTProblem, allows an action to visit a problem.
*/ */
public class CASTProblem extends CASTNode implements IASTProblem { public class CASTProblem extends ASTProblem {
public CASTProblem(int id, char[] arg, boolean isError) {
private final char[] arg; super(id, arg, isError);
private final int id;
private final boolean isError;
private final boolean isWarning;
private String message = null;
public CASTProblem(int id, char[] arg, boolean warn, boolean error) {
this.id = id;
this.arg = arg;
this.isWarning = warn;
this.isError = error;
} }
public int getID() { @Override
return id; public boolean accept( ASTVisitor action ){
}
public boolean isError() {
return isError;
}
public boolean isWarning() {
return isWarning;
}
protected static final Map errorMessages;
static {
errorMessages = new HashMap();
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_POUND_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.error")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_POUND_WARNING), ParserMessages
.getString("ScannerProblemFactory.error.preproc.warning")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.inclusionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_DEFINITION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.definitionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_DEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroDefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_REDEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroRedefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_UNBALANCE_CONDITION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.unbalancedConditional")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_CONDITIONAL_EVAL_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.conditionalEval")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_USAGE_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroUsage")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_CIRCULAR_INCLUSION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.circularInclusion")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_DIRECTIVE),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidDirective")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_PASTING_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroPasting")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_MISSING_RPAREN_PARMLIST),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_VA_ARGS),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidVaArgs")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_INVALID_ESCAPECHAR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.invalidEscapeChar")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNBOUNDED_STRING),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unboundedString")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_FLOATING_POINT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badFloatingPoint")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_HEX_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badHexFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_OCTAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badOctalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_DECIMAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badDecimalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ASSIGNMENT_NOT_ALLOWED),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.assignmentNotAllowed")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_DIVIDE_BY_ZERO),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.divideByZero")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_MISSING_R_PAREN),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_EXPRESSION_SYNTAX_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.expressionSyntaxError")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ILLEGAL_IDENTIFIER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.illegalIdentifier")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CONDITIONAL_EXPRESSION),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badConditionalExpression")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNEXPECTED_EOF),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unexpectedEOF")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CHARACTER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badCharacter")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SYNTAX_ERROR), ParserMessages
.getString("ParserProblemFactory.error.syntax.syntaxError")); //$NON-NLS-1$
}
protected final static String AST_PROBLEM_PATTERN = "BaseProblemFactory.astProblemPattern"; //$NON-NLS-1$
public String getMessage() {
if (message != null)
return message;
String msg = (String) errorMessages.get(new Integer(id));
if (msg == null)
msg = ""; //$NON-NLS-1$
if (arg != null) {
msg = MessageFormat.format(msg, new Object[] { new String(arg) });
}
String file = null;
int offset = 0;
IASTFileLocation f = getFileLocation();
if( f == null )
{
file = ""; //$NON-NLS-1$
offset = 0;
}
else
{
file = f.getFileName();
offset = f.getNodeOffset();
}
Object[] args = new Object[] { msg, file, new Integer( offset ) };
message = ParserMessages.getFormattedString(AST_PROBLEM_PATTERN, args);
return message;
}
public boolean checkCategory(int bitmask) {
return ((id & bitmask) != 0);
}
public String getArguments() {
return arg != null ? String.valueOf(arg) : ""; //$NON-NLS-1$
}
public IASTTranslationUnit getTranslationUnit() {
if (this instanceof IASTTranslationUnit)
return (IASTTranslationUnit) this;
IASTNode node = getParent();
while (!(node instanceof IASTTranslationUnit) && node != null) {
node = node.getParent();
}
return (IASTTranslationUnit) node;
}
public boolean accept( ASTVisitor action ){
if( action.shouldVisitProblems ){ if( action.shouldVisitProblems ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -1,13 +1,14 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research) * Yuan Zhang / Beth Tibbitts (IBM Research)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
@ -29,6 +30,7 @@ public class CASTProblemDeclaration extends CASTProblemOwner implements
super(problem); super(problem);
} }
@Override
public boolean accept( ASTVisitor action ){ public boolean accept( ASTVisitor action ){
if( action.shouldVisitDeclarations ){ if( action.shouldVisitDeclarations ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
@ -37,6 +39,7 @@ public class CASTProblemDeclaration extends CASTProblemOwner implements
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitDeclarations ){ if( action.shouldVisitDeclarations ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -46,5 +49,4 @@ public class CASTProblemDeclaration extends CASTProblemOwner implements
} }
return true; return true;
} }
} }

View file

@ -1,13 +1,14 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research) * Yuan Zhang / Beth Tibbitts (IBM Research)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
@ -29,6 +30,7 @@ public class CASTProblemExpression extends CASTProblemOwner implements IASTProbl
super(problem); super(problem);
} }
@Override
public boolean accept( ASTVisitor action ){ public boolean accept( ASTVisitor action ){
if( action.shouldVisitExpressions ){ if( action.shouldVisitExpressions ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
@ -37,6 +39,7 @@ public class CASTProblemExpression extends CASTProblemOwner implements IASTProbl
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitExpressions ){ if( action.shouldVisitExpressions ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -1,15 +1,17 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemHolder; import org.eclipse.cdt.core.dom.ast.IASTProblemHolder;
@ -39,4 +41,20 @@ abstract class CASTProblemOwner extends CASTNode implements IASTProblemHolder {
} }
} }
@Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitProblems ){
switch( action.visit( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
switch( action.leave( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
}
return true;
}
} }

View file

@ -1,13 +1,14 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Yuan Zhang / Beth Tibbitts (IBM Research) * Yuan Zhang / Beth Tibbitts (IBM Research)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
@ -20,14 +21,14 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemStatement;
*/ */
public class CASTProblemStatement extends CASTProblemOwner implements IASTProblemStatement { public class CASTProblemStatement extends CASTProblemOwner implements IASTProblemStatement {
public CASTProblemStatement() {
public CASTProblemStatement() {
} }
public CASTProblemStatement(IASTProblem problem) { public CASTProblemStatement(IASTProblem problem) {
super(problem); super(problem);
} }
@Override
public boolean accept( ASTVisitor action ){ public boolean accept( ASTVisitor action ){
if( action.shouldVisitStatements ){ if( action.shouldVisitStatements ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
@ -36,6 +37,7 @@ public class CASTProblemStatement extends CASTProblemOwner implements IASTProble
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitStatements ){ if( action.shouldVisitStatements ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -78,7 +78,8 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
private boolean fIsHeader= true; private boolean fIsHeader= true;
private IIndexFileSet fIndexFileSet; private IIndexFileSet fIndexFileSet;
public IASTTranslationUnit getTranslationUnit() { @Override
public IASTTranslationUnit getTranslationUnit() {
return this; return this;
} }
@ -246,6 +247,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration)
*/ */
@Override
public int visit(IASTDeclaration declaration) { public int visit(IASTDeclaration declaration) {
// use declarations to determine if the search has gone past the // use declarations to determine if the search has gone past the
// offset (i.e. don't know the order the visitor visits the nodes) // offset (i.e. don't know the order the visitor visits the nodes)
@ -261,6 +263,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator)
*/ */
@Override
public int visit(IASTDeclarator declarator) { public int visit(IASTDeclarator declarator) {
int ret = processNode(declarator); int ret = processNode(declarator);
@ -283,6 +286,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDesignator(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDesignator(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator)
*/ */
@Override
public int visit(ICASTDesignator designator) { public int visit(ICASTDesignator designator) {
return processNode(designator); return processNode(designator);
} }
@ -292,6 +296,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier)
*/ */
@Override
public int visit(IASTDeclSpecifier declSpec) { public int visit(IASTDeclSpecifier declSpec) {
return processNode(declSpec); return processNode(declSpec);
} }
@ -301,6 +306,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator)
*/ */
@Override
public int visit(IASTEnumerator enumerator) { public int visit(IASTEnumerator enumerator) {
return processNode(enumerator); return processNode(enumerator);
} }
@ -310,6 +316,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression)
*/ */
@Override
public int visit(IASTExpression expression) { public int visit(IASTExpression expression) {
return processNode(expression); return processNode(expression);
} }
@ -319,6 +326,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer)
*/ */
@Override
public int visit(IASTInitializer initializer) { public int visit(IASTInitializer initializer) {
return processNode(initializer); return processNode(initializer);
} }
@ -328,6 +336,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName)
*/ */
@Override
public int visit(IASTName name) { public int visit(IASTName name) {
if (name.toString() != null) if (name.toString() != null)
return processNode(name); return processNode(name);
@ -339,6 +348,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration)
*/ */
@Override
public int visit( public int visit(
IASTParameterDeclaration parameterDeclaration) { IASTParameterDeclaration parameterDeclaration) {
return processNode(parameterDeclaration); return processNode(parameterDeclaration);
@ -349,6 +359,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement)
*/ */
@Override
public int visit(IASTStatement statement) { public int visit(IASTStatement statement) {
return processNode(statement); return processNode(statement);
} }
@ -358,6 +369,7 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
* *
* @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId)
*/ */
@Override
public int visit(IASTTypeId typeId) { public int visit(IASTTypeId typeId) {
return processNode(typeId); return processNode(typeId);
} }
@ -469,6 +481,11 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
return result; return result;
} }
public int getPreprocessorProblemsCount() {
return resolver == null ? 0 : resolver.getScannerProblemsCount();
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -480,7 +497,8 @@ public class CASTTranslationUnit extends CASTNode implements IASTTranslationUnit
return new String(resolver.getTranslationUnitPath()); return new String(resolver.getTranslationUnitPath());
} }
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitTranslationUnit){ if( action.shouldVisitTranslationUnit){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -201,9 +201,9 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
result.addInitializer(initializer); result.addInitializer(initializer);
} else { } else {
ICASTDesignatedInitializer desigInitializer = createDesignatorInitializer(); ICASTDesignatedInitializer desigInitializer = createDesignatorInitializer();
((CASTNode) desigInitializer).setOffsetAndLength( ((ASTNode) desigInitializer).setOffsetAndLength(
((CASTNode) newDesignators.get(0)).getOffset(), ((ASTNode) newDesignators.get(0)).getOffset(),
((CASTNode)initializer).getOffset() + ((CASTNode)initializer).getLength() - ((CASTNode) newDesignators.get(0)).getOffset()); ((ASTNode)initializer).getOffset() + ((ASTNode)initializer).getLength() - ((ASTNode) newDesignators.get(0)).getOffset());
for (int i = 0; i < newDesignators.size(); ++i) { for (int i = 0; i < newDesignators.size(); ++i) {
ICASTDesignator d = (ICASTDesignator) newDesignators.get(i); ICASTDesignator d = (ICASTDesignator) newDesignators.get(i);
desigInitializer.addDesignator(d); desigInitializer.addDesignator(d);
@ -390,7 +390,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return new CASTFieldDesignator(); return new CASTFieldDesignator();
} }
protected IASTDeclaration declaration() throws EndOfFileException, @Override
protected IASTDeclaration declaration() throws EndOfFileException,
BacktrackException { BacktrackException {
switch (LT(1)) { switch (LT(1)) {
case IToken.t_asm: case IToken.t_asm:
@ -406,7 +407,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @throws BacktrackException * @throws BacktrackException
* @throws EndOfFileException * @throws EndOfFileException
*/ */
protected IASTDeclaration simpleDeclaration() throws BacktrackException, @Override
protected IASTDeclaration simpleDeclaration() throws BacktrackException,
EndOfFileException { EndOfFileException {
IToken firstToken = LA(1); IToken firstToken = LA(1);
int firstOffset = firstToken.getOffset(); int firstOffset = firstToken.getOffset();
@ -511,7 +513,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
/** /**
* @return * @return
*/ */
protected IASTSimpleDeclaration createSimpleDeclaration() { @Override
protected IASTSimpleDeclaration createSimpleDeclaration() {
return new CASTSimpleDeclaration(); return new CASTSimpleDeclaration();
} }
@ -534,7 +537,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* *
* translationUnit : (declaration)* * translationUnit : (declaration)*
*/ */
protected void translationUnit() { @Override
protected void translationUnit() {
try { try {
translationUnit = createTranslationUnit(); translationUnit = createTranslationUnit();
translationUnit.setIndex(index); translationUnit.setIndex(index);
@ -569,10 +573,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTDeclaration[] declarations = translationUnit.getDeclarations(); IASTDeclaration[] declarations = translationUnit.getDeclarations();
// As expected // As expected
if (declarations.length != 0) { if (declarations.length != 0) {
CASTNode d = (CASTNode) declarations[declarations.length-1]; ASTNode d = (ASTNode) declarations[declarations.length-1];
((CASTNode) translationUnit).setLength(d.getOffset() + d.getLength()); ((ASTNode) translationUnit).setLength(d.getOffset() + d.getLength());
} else } else
((CASTNode) translationUnit).setLength(0); ((ASTNode) translationUnit).setLength(0);
break; break;
} catch (BacktrackException b) { } catch (BacktrackException b) {
try { try {
@ -580,7 +584,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(b); IASTProblem p = failParse(b);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CASTNode) pd).setOffsetAndLength(((CASTNode) p).getOffset(), ((CASTNode) p).getLength()); ((ASTNode) pd).setOffsetAndLength(((ASTNode) p).getOffset(), ((ASTNode) p).getLength());
translationUnit.addDeclaration(pd); translationUnit.addDeclaration(pd);
errorHandling(); errorHandling();
if (lastBacktrack != -1 && lastBacktrack == LA(1).hashCode()) { if (lastBacktrack != -1 && lastBacktrack == LA(1).hashCode()) {
@ -620,7 +624,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param expression * @param expression
* @throws BacktrackException * @throws BacktrackException
*/ */
protected IASTExpression assignmentExpression() throws EndOfFileException, @Override
protected IASTExpression assignmentExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tLBRACE && supportStatementsInExpressions) { if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tLBRACE && supportStatementsInExpressions) {
IASTExpression resultExpression = compoundStatementExpression(); IASTExpression resultExpression = compoundStatementExpression();
@ -664,7 +669,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param expression * @param expression
* @throws BacktrackException * @throws BacktrackException
*/ */
protected IASTExpression relationalExpression() throws BacktrackException, @Override
protected IASTExpression relationalExpression() throws BacktrackException,
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = shiftExpression(); IASTExpression firstExpression = shiftExpression();
@ -705,7 +711,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param expression * @param expression
* @throws BacktrackException * @throws BacktrackException
*/ */
protected IASTExpression multiplicativeExpression() @Override
protected IASTExpression multiplicativeExpression()
throws BacktrackException, EndOfFileException { throws BacktrackException, EndOfFileException {
IASTExpression firstExpression = castExpression(); IASTExpression firstExpression = castExpression();
for (;;) { for (;;) {
@ -740,7 +747,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
/** /**
* castExpression : unaryExpression | "(" typeId ")" castExpression * castExpression : unaryExpression | "(" typeId ")" castExpression
*/ */
protected IASTExpression castExpression() throws EndOfFileException, @Override
protected IASTExpression castExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
// TO DO: we need proper symbol checkint to ensure type name // TO DO: we need proper symbol checkint to ensure type name
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
@ -807,7 +815,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param expression * @param expression
* @throws BacktrackException * @throws BacktrackException
*/ */
protected IASTExpression unaryExpression() throws EndOfFileException, @Override
protected IASTExpression unaryExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
switch (LT(1)) { switch (LT(1)) {
case IToken.tSTAR: case IToken.tSTAR:
@ -850,7 +859,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param op * @param op
* @return * @return
*/ */
protected IASTExpression buildTypeIdExpression(int op, IASTTypeId typeId, @Override
protected IASTExpression buildTypeIdExpression(int op, IASTTypeId typeId,
int startingOffset, int endingOffset) { int startingOffset, int endingOffset) {
IASTTypeIdExpression result = createTypeIdExpression(); IASTTypeIdExpression result = createTypeIdExpression();
result.setOperator(op); result.setOperator(op);
@ -953,13 +963,13 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
int offset = consume().getEndOffset(); int offset = consume().getEndOffset();
firstExpression = buildUnaryExpression( firstExpression = buildUnaryExpression(
IASTUnaryExpression.op_postFixIncr, firstExpression, IASTUnaryExpression.op_postFixIncr, firstExpression,
((CASTNode) firstExpression).getOffset(), offset); ((ASTNode) firstExpression).getOffset(), offset);
break; break;
case IToken.tDECR: case IToken.tDECR:
offset = consume().getEndOffset(); offset = consume().getEndOffset();
firstExpression = buildUnaryExpression( firstExpression = buildUnaryExpression(
IASTUnaryExpression.op_postFixDecr, firstExpression, IASTUnaryExpression.op_postFixDecr, firstExpression,
((CASTNode) firstExpression).getOffset(), offset); ((ASTNode) firstExpression).getOffset(), offset);
break; break;
case IToken.tDOT: case IToken.tDOT:
// member access // member access
@ -1130,11 +1140,13 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
/** /**
* @return * @return
*/ */
protected IASTIdExpression createIdExpression() { @Override
protected IASTIdExpression createIdExpression() {
return new CASTIdExpression(); return new CASTIdExpression();
} }
protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException { @Override
protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException {
if (!canBeTypeSpecifier()) { if (!canBeTypeSpecifier()) {
return null; return null;
} }
@ -1570,7 +1582,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
/** /**
* @return * @return
*/ */
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() { @Override
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() {
return new CASTTypedefNameSpecifier(); return new CASTTypedefNameSpecifier();
} }
@ -1657,14 +1670,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
failParseWithErrorHandling(); failParseWithErrorHandling();
} }
} }
((CASTNode) result).setLength(endOffset - classKey.getOffset()); ((ASTNode) result).setLength(endOffset - classKey.getOffset());
return result; return result;
} }
/** /**
* @return * @return
*/ */
protected IASTName createName() { @Override
protected IASTName createName() {
return new CASTName(); return new CASTName();
} }
@ -1712,7 +1726,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return new CASTElaboratedTypeSpecifier(); return new CASTElaboratedTypeSpecifier();
} }
protected IASTDeclarator initDeclarator() throws EndOfFileException, BacktrackException { @Override
protected IASTDeclarator initDeclarator() throws EndOfFileException, BacktrackException {
IASTDeclarator d = declarator(); IASTDeclarator d = declarator();
IASTInitializer i = optionalCInitializer(); IASTInitializer i = optionalCInitializer();
@ -2004,7 +2019,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* @param t * @param t
* @return * @return
*/ */
protected IASTName createName(IToken t) { @Override
protected IASTName createName(IToken t) {
IASTName n = new CASTName(t.getCharImage()); IASTName n = new CASTName(t.getCharImage());
switch (t.getType()) { switch (t.getType()) {
case IToken.tCOMPLETION: case IToken.tCOMPLETION:
@ -2158,47 +2174,58 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
} }
protected IASTTranslationUnit getTranslationUnit() { @Override
protected IASTTranslationUnit getTranslationUnit() {
return translationUnit; return translationUnit;
} }
protected IASTCompoundStatement createCompoundStatement() { @Override
protected IASTCompoundStatement createCompoundStatement() {
return new CASTCompoundStatement(); return new CASTCompoundStatement();
} }
protected IASTBinaryExpression createBinaryExpression() { @Override
protected IASTBinaryExpression createBinaryExpression() {
return new CASTBinaryExpression(); return new CASTBinaryExpression();
} }
protected IASTConditionalExpression createConditionalExpression() { @Override
protected IASTConditionalExpression createConditionalExpression() {
return new CASTConditionalExpression(); return new CASTConditionalExpression();
} }
protected IASTUnaryExpression createUnaryExpression() { @Override
protected IASTUnaryExpression createUnaryExpression() {
return new CASTUnaryExpression(); return new CASTUnaryExpression();
} }
protected IGNUASTCompoundStatementExpression createCompoundStatementExpression() { @Override
protected IGNUASTCompoundStatementExpression createCompoundStatementExpression() {
return new CASTCompoundStatementExpression(); return new CASTCompoundStatementExpression();
} }
protected IASTExpressionList createExpressionList() { @Override
protected IASTExpressionList createExpressionList() {
return new CASTExpressionList(); return new CASTExpressionList();
} }
protected IASTEnumerator createEnumerator() { @Override
protected IASTEnumerator createEnumerator() {
return new CASTEnumerator(); return new CASTEnumerator();
} }
protected IASTLabelStatement createLabelStatement() { @Override
protected IASTLabelStatement createLabelStatement() {
return new CASTLabelStatement(); return new CASTLabelStatement();
} }
protected IASTGotoStatement createGoToStatement() { @Override
protected IASTGotoStatement createGoToStatement() {
return new CASTGotoStatement(); return new CASTGotoStatement();
} }
protected IASTReturnStatement createReturnStatement() { @Override
protected IASTReturnStatement createReturnStatement() {
return new CASTReturnStatement(); return new CASTReturnStatement();
} }
@ -2206,23 +2233,28 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return new CASTForStatement(); return new CASTForStatement();
} }
protected IASTContinueStatement createContinueStatement() { @Override
protected IASTContinueStatement createContinueStatement() {
return new CASTContinueStatement(); return new CASTContinueStatement();
} }
protected IASTDoStatement createDoStatement() { @Override
protected IASTDoStatement createDoStatement() {
return new CASTDoStatement(); return new CASTDoStatement();
} }
protected IASTBreakStatement createBreakStatement() { @Override
protected IASTBreakStatement createBreakStatement() {
return new CASTBreakStatement(); return new CASTBreakStatement();
} }
protected IASTWhileStatement createWhileStatement() { @Override
protected IASTWhileStatement createWhileStatement() {
return new CASTWhileStatement(); return new CASTWhileStatement();
} }
protected IASTNullStatement createNullStatement() { @Override
protected IASTNullStatement createNullStatement() {
return new CASTNullStatement(); return new CASTNullStatement();
} }
@ -2234,35 +2266,43 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return new CASTIfStatement(); return new CASTIfStatement();
} }
protected IASTDefaultStatement createDefaultStatement() { @Override
protected IASTDefaultStatement createDefaultStatement() {
return new CASTDefaultStatement(); return new CASTDefaultStatement();
} }
protected IASTCaseStatement createCaseStatement() { @Override
protected IASTCaseStatement createCaseStatement() {
return new CASTCaseStatement(); return new CASTCaseStatement();
} }
protected IASTExpressionStatement createExpressionStatement() { @Override
protected IASTExpressionStatement createExpressionStatement() {
return new CASTExpressionStatement(); return new CASTExpressionStatement();
} }
protected IASTDeclarationStatement createDeclarationStatement() { @Override
protected IASTDeclarationStatement createDeclarationStatement() {
return new CASTDeclarationStatement(); return new CASTDeclarationStatement();
} }
protected IASTASMDeclaration createASMDirective() { @Override
protected IASTASMDeclaration createASMDirective() {
return new CASTASMDeclaration(); return new CASTASMDeclaration();
} }
protected IASTEnumerationSpecifier createEnumerationSpecifier() { @Override
protected IASTEnumerationSpecifier createEnumerationSpecifier() {
return new CASTEnumerationSpecifier(); return new CASTEnumerationSpecifier();
} }
protected IASTCastExpression createCastExpression() { @Override
protected IASTCastExpression createCastExpression() {
return new CASTCastExpression(); return new CASTCastExpression();
} }
protected IASTStatement statement() throws EndOfFileException, @Override
protected IASTStatement statement() throws EndOfFileException,
BacktrackException { BacktrackException {
switch (LT(1)) { switch (LT(1)) {
// labeled statements // labeled statements
@ -2308,20 +2348,24 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
} }
protected void nullifyTranslationUnit() { @Override
protected void nullifyTranslationUnit() {
translationUnit = null; translationUnit = null;
} }
protected IASTProblemStatement createProblemStatement() { @Override
protected IASTProblemStatement createProblemStatement() {
return new CASTProblemStatement(); return new CASTProblemStatement();
} }
protected IASTProblemExpression createProblemExpression() { @Override
protected IASTProblemExpression createProblemExpression() {
return new CASTProblemExpression(); return new CASTProblemExpression();
} }
protected IASTProblem createProblem(int signal, int offset, int length) { @Override
IASTProblem result = new CASTProblem(signal, EMPTY_STRING, false, true); protected IASTProblem createProblem(int signal, int offset, int length) {
IASTProblem result = new CASTProblem(signal, EMPTY_STRING, true);
((ASTNode) result).setOffsetAndLength(offset, length); ((ASTNode) result).setOffsetAndLength(offset, length);
return result; return result;
} }
@ -2427,15 +2471,18 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return pd; return pd;
} }
protected ASTVisitor createVisitor() { @Override
protected ASTVisitor createVisitor() {
return EMPTY_VISITOR; return EMPTY_VISITOR;
} }
protected IASTAmbiguousStatement createAmbiguousStatement() { @Override
protected IASTAmbiguousStatement createAmbiguousStatement() {
return new CASTAmbiguousStatement(); return new CASTAmbiguousStatement();
} }
protected IASTAmbiguousExpression createAmbiguousExpression() { @Override
protected IASTAmbiguousExpression createAmbiguousExpression() {
return new CASTAmbiguousExpression(); return new CASTAmbiguousExpression();
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -14,6 +14,7 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompletionContext; import org.eclipse.cdt.core.dom.ast.IASTCompletionContext;
@ -29,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
/** /**
@ -166,7 +168,8 @@ public class CPPASTName extends CPPASTNode implements IASTName, IASTCompletionCo
return binding; return binding;
} }
public String toString() { @Override
public String toString() {
if (name == EMPTY_CHAR_ARRAY) if (name == EMPTY_CHAR_ARRAY)
return EMPTY_STRING; return EMPTY_STRING;
return new String(name); return new String(name);
@ -180,7 +183,8 @@ public class CPPASTName extends CPPASTNode implements IASTName, IASTCompletionCo
this.name = name; this.name = name;
} }
public boolean accept(ASTVisitor action) { @Override
public boolean accept(ASTVisitor action) {
if (action.shouldVisitNames) { if (action.shouldVisitNames) {
switch (action.visit(this)) { switch (action.visit(this)) {
case ASTVisitor.PROCESS_ABORT: case ASTVisitor.PROCESS_ABORT:
@ -248,4 +252,11 @@ public class CPPASTName extends CPPASTNode implements IASTName, IASTCompletionCo
} }
return false; return false;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTName#getLinkage()
*/
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
} }

View file

@ -1,25 +1,19 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
/** /**
* @author jcamelon * @author jcamelon
*/ */
public abstract class CPPASTNode extends ASTNode { public abstract class CPPASTNode extends ASTNode {
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
} }

View file

@ -1,258 +1,31 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Anton Leherbauer (Wind River Systems) * Anton Leherbauer (Wind River Systems)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.internal.core.dom.parser.ASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.internal.core.parser.ParserMessages;
/** /**
* @author jcamelon * cpp-specific implementation allows actions to visit the problem.
*/ */
public class CPPASTProblem extends CPPASTNode implements IASTProblem { public class CPPASTProblem extends ASTProblem {
private final char[] arg; public CPPASTProblem(int id, char[] arg, boolean isError) {
private final int id; super(id, arg, isError);
private final boolean isError;
private final boolean isWarning;
private String message = null;
public CPPASTProblem(int id, char[] arg, boolean warn, boolean error) {
this.id = id;
this.arg = arg;
this.isWarning = warn;
this.isError = error;
} }
@Override
public int getID() { public boolean accept( ASTVisitor action ){
return id;
}
public boolean isError() {
return isError;
}
public boolean isWarning() {
return isWarning;
}
protected static final Map errorMessages;
static {
errorMessages = new HashMap();
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_POUND_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.error")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_POUND_WARNING), ParserMessages
.getString("ScannerProblemFactory.error.preproc.warning")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.inclusionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_DEFINITION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.definitionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_DEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroDefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_REDEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroRedefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_UNBALANCE_CONDITION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.unbalancedConditional")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_CONDITIONAL_EVAL_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.conditionalEval")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_USAGE_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroUsage")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_CIRCULAR_INCLUSION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.circularInclusion")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_DIRECTIVE),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidDirective")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_PASTING_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroPasting")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_MISSING_RPAREN_PARMLIST),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_VA_ARGS),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidVaArgs")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_INVALID_ESCAPECHAR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.invalidEscapeChar")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNBOUNDED_STRING),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unboundedString")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_FLOATING_POINT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badFloatingPoint")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_HEX_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badHexFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_OCTAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badOctalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_DECIMAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badDecimalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ASSIGNMENT_NOT_ALLOWED),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.assignmentNotAllowed")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_DIVIDE_BY_ZERO),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.divideByZero")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_MISSING_R_PAREN),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_EXPRESSION_SYNTAX_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.expressionSyntaxError")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ILLEGAL_IDENTIFIER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.illegalIdentifier")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CONDITIONAL_EXPRESSION),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badConditionalExpression")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNEXPECTED_EOF),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unexpectedEOF")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CHARACTER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badCharacter")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SYNTAX_ERROR), ParserMessages
.getString("ParserProblemFactory.error.syntax.syntaxError")); //$NON-NLS-1$
}
protected final static String AST_PROBLEM_PATTERN = "BaseProblemFactory.astProblemPattern"; //$NON-NLS-1$
public String getMessage() {
if (message != null)
return message;
String msg = (String) errorMessages.get(new Integer(id));
if (msg == null)
msg = ""; //$NON-NLS-1$
if (arg != null) {
msg = MessageFormat.format(msg, new Object[] { new String(arg) });
}
String file = null;
int offset = 0;
IASTFileLocation f = getFileLocation();
if( f == null )
{
file = ""; //$NON-NLS-1$
offset = 0;
}
else
{
file = f.getFileName();
offset = f.getNodeOffset();
}
Object[] args = new Object[] { msg, file, new Integer(offset) };
message = ParserMessages.getFormattedString(AST_PROBLEM_PATTERN, args);
return message;
}
public boolean checkCategory(int bitmask) {
return ((id & bitmask) != 0);
}
public String getArguments() {
return arg != null ? String.valueOf(arg) : ""; //$NON-NLS-1$
}
public IASTTranslationUnit getTranslationUnit() {
if (this instanceof IASTTranslationUnit)
return (IASTTranslationUnit) this;
IASTNode node = getParent();
while (!(node instanceof IASTTranslationUnit) && node != null) {
node = node.getParent();
}
return (IASTTranslationUnit) node;
}
public boolean accept( ASTVisitor action ){
if( action.shouldVisitProblems ){ if( action.shouldVisitProblems ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -1,12 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -19,7 +20,8 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration;
public class CPPASTProblemDeclaration extends CPPASTProblemOwner implements public class CPPASTProblemDeclaration extends CPPASTProblemOwner implements
IASTProblemDeclaration { IASTProblemDeclaration {
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitDeclarations ){ if( action.shouldVisitDeclarations ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -27,6 +29,7 @@ public class CPPASTProblemDeclaration extends CPPASTProblemOwner implements
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitDeclarations ){ if( action.shouldVisitDeclarations ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -1,12 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -20,7 +21,8 @@ import org.eclipse.cdt.core.dom.ast.IType;
public class CPPASTProblemExpression extends CPPASTProblemOwner implements public class CPPASTProblemExpression extends CPPASTProblemOwner implements
IASTProblemExpression { IASTProblemExpression {
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitExpressions ){ if( action.shouldVisitExpressions ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -28,6 +30,7 @@ public class CPPASTProblemExpression extends CPPASTProblemOwner implements
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitExpressions ){ if( action.shouldVisitExpressions ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -41,5 +44,4 @@ public class CPPASTProblemExpression extends CPPASTProblemOwner implements
public IType getExpressionType() { public IType getExpressionType() {
return null; return null;
} }
} }

View file

@ -1,15 +1,17 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemHolder; import org.eclipse.cdt.core.dom.ast.IASTProblemHolder;
@ -39,4 +41,21 @@ abstract class CPPASTProblemOwner extends CPPASTNode implements IASTProblemHolde
p.setPropertyInParent(PROBLEM); p.setPropertyInParent(PROBLEM);
} }
} }
@Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitProblems ){
switch( action.visit( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
switch( action.leave( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
}
return true;
}
} }

View file

@ -1,12 +1,13 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -18,7 +19,8 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemStatement;
*/ */
public class CPPASTProblemStatement extends CPPASTProblemOwner implements public class CPPASTProblemStatement extends CPPASTProblemOwner implements
IASTProblemStatement { IASTProblemStatement {
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitStatements ){ if( action.shouldVisitStatements ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -26,6 +28,7 @@ public class CPPASTProblemStatement extends CPPASTProblemOwner implements
default : break; default : break;
} }
} }
super.accept(action); // visits the problem
if( action.shouldVisitStatements ){ if( action.shouldVisitStatements ){
switch( action.leave( this ) ){ switch( action.leave( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;

View file

@ -1,15 +1,17 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId; import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId;
@ -40,4 +42,20 @@ public class CPPASTProblemTypeId extends CPPASTTypeId implements IASTProblemType
} }
} }
@Override
public final boolean accept( ASTVisitor action ){
if( action.shouldVisitProblems ){
switch( action.visit( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
switch( action.leave( getProblem() ) ){
case ASTVisitor.PROCESS_ABORT : return false;
case ASTVisitor.PROCESS_SKIP : return true;
default : break;
}
}
return true;
}
} }

View file

@ -6,14 +6,16 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Bryan Wilkinson (QNX) * Bryan Wilkinson (QNX)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompletionContext; import org.eclipse.cdt.core.dom.ast.IASTCompletionContext;
@ -22,8 +24,8 @@ import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName;
@ -34,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.Linkage;
/** /**
* @author jcamelon * @author jcamelon
@ -321,4 +324,11 @@ public class CPPASTQualifiedName extends CPPASTNode implements
return CharArrayUtils.equals(potential, 0, name.length, name, true); return CharArrayUtils.equals(potential, 0, name.length, name, true);
return CharArrayUtils.equals(potential, name); return CharArrayUtils.equals(potential, name);
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTName#getLinkage()
*/
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
} }

View file

@ -1,15 +1,17 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others. * Copyright (c) 2004, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM - Initial API and implementation * IBM - Initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompletionContext; import org.eclipse.cdt.core.dom.ast.IASTCompletionContext;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
@ -20,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/** /**
@ -96,11 +99,13 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId, I
public char[] toCharArray() { public char[] toCharArray() {
return templateName.toCharArray(); return templateName.toCharArray();
} }
public String toString() { @Override
public String toString() {
return templateName.toString(); return templateName.toString();
} }
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitNames ){ if( action.shouldVisitNames ){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -173,4 +178,11 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId, I
binding= new CPPASTName.RecursionResolvingBinding(this); binding= new CPPASTName.RecursionResolvingBinding(this);
} }
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTName#getLinkage()
*/
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
} }

View file

@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
@ -62,6 +63,7 @@ import org.eclipse.cdt.core.index.IIndexFile;
import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
@ -96,7 +98,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
public CPPASTTranslationUnit() { public CPPASTTranslationUnit() {
} }
public IASTTranslationUnit getTranslationUnit() { @Override
public IASTTranslationUnit getTranslationUnit() {
return this; return this;
} }
@ -284,7 +287,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
} }
public int visit(IASTDeclaration declaration) { @Override
public int visit(IASTDeclaration declaration) {
// use declarations to determine if the search has gone past the offset (i.e. don't know the order the visitor visits the nodes) // use declarations to determine if the search has gone past the offset (i.e. don't know the order the visitor visits the nodes)
if (declaration instanceof ASTNode && ((ASTNode)declaration).getOffset() > offset) if (declaration instanceof ASTNode && ((ASTNode)declaration).getOffset() > offset)
return PROCESS_ABORT; return PROCESS_ABORT;
@ -293,7 +297,8 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
} }
public int visit(IASTDeclarator declarator) { @Override
public int visit(IASTDeclarator declarator) {
int ret = processNode(declarator); int ret = processNode(declarator);
IASTPointerOperator[] ops = declarator.getPointerOperators(); IASTPointerOperator[] ops = declarator.getPointerOperators();
@ -328,38 +333,46 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
return processNode(designator); return processNode(designator);
} }
public int visit(IASTDeclSpecifier declSpec) { @Override
public int visit(IASTDeclSpecifier declSpec) {
return processNode(declSpec); return processNode(declSpec);
} }
public int visit(IASTEnumerator enumerator) { @Override
public int visit(IASTEnumerator enumerator) {
return processNode(enumerator); return processNode(enumerator);
} }
public int visit(IASTExpression expression) { @Override
public int visit(IASTExpression expression) {
return processNode(expression); return processNode(expression);
} }
public int visit(IASTInitializer initializer) { @Override
public int visit(IASTInitializer initializer) {
return processNode(initializer); return processNode(initializer);
} }
public int visit(IASTName name) { @Override
public int visit(IASTName name) {
if ( name.toString() != null ) if ( name.toString() != null )
return processNode(name); return processNode(name);
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
public int visit( @Override
public int visit(
IASTParameterDeclaration parameterDeclaration) { IASTParameterDeclaration parameterDeclaration) {
return processNode(parameterDeclaration); return processNode(parameterDeclaration);
} }
public int visit(IASTStatement statement) { @Override
public int visit(IASTStatement statement) {
return processNode(statement); return processNode(statement);
} }
public int visit(IASTTypeId typeId) { @Override
public int visit(IASTTypeId typeId) {
return processNode(typeId); return processNode(typeId);
} }
@ -436,13 +449,18 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
return result; return result;
} }
public int getPreprocessorProblemsCount() {
return resolver == null ? 0 : resolver.getScannerProblemsCount();
}
public String getFilePath() { public String getFilePath() {
if (resolver == null) if (resolver == null)
return EMPTY_STRING; return EMPTY_STRING;
return new String(resolver.getTranslationUnitPath()); return new String(resolver.getTranslationUnitPath());
} }
public boolean accept( ASTVisitor action ){ @Override
public boolean accept( ASTVisitor action ){
if( action.shouldVisitTranslationUnit){ if( action.shouldVisitTranslationUnit){
switch( action.visit( this ) ){ switch( action.visit( this ) ){
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT : return false;
@ -566,4 +584,11 @@ public class CPPASTTranslationUnit extends CPPASTNode implements ICPPASTTranslat
IIndexFileSet getFileSet() { IIndexFileSet getFileSet() {
return fIndexFileSet; return fIndexFileSet;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTTranslationUnit#getLinkage()
*/
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
} }

View file

@ -1300,7 +1300,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
} }
((CPPASTNode) result).setLength(lastOffset - startingOffset); ((ASTNode) result).setLength(lastOffset - startingOffset);
return result; return result;
} }
@ -2019,7 +2019,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(bt); IASTProblem p = failParse(bt);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CPPASTNode) pd).setOffsetAndLength(((CPPASTNode) p)); ((ASTNode) pd).setOffsetAndLength(((ASTNode) p));
linkage.addDeclaration(pd); linkage.addDeclaration(pd);
errorHandling(); errorHandling();
if (checkToken == LA(1).hashCode()) if (checkToken == LA(1).hashCode())
@ -2031,14 +2031,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
// consume the } // consume the }
int endOffset = consume(IToken.tRBRACE).getEndOffset(); int endOffset = consume(IToken.tRBRACE).getEndOffset();
((CPPASTNode) linkage).setLength(endOffset - firstToken.getOffset()); ((ASTNode) linkage).setLength(endOffset - firstToken.getOffset());
return linkage; return linkage;
} }
// single declaration // single declaration
IASTDeclaration d = declaration(); IASTDeclaration d = declaration();
linkage.addDeclaration(d); linkage.addDeclaration(d);
((CPPASTNode) linkage).setLength(calculateEndOffset(d) - firstToken.getOffset()); ((ASTNode) linkage).setLength(calculateEndOffset(d) - firstToken.getOffset());
return linkage; return linkage;
} }
@ -2406,7 +2406,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return d2; return d2;
IASTAmbiguousDeclaration result = createAmbiguousDeclaration(); IASTAmbiguousDeclaration result = createAmbiguousDeclaration();
((CPPASTNode) result).setOffsetAndLength((ASTNode) d1); ((ASTNode) result).setOffsetAndLength((ASTNode) d1);
result.addDeclaration(d1); result.addDeclaration(d1);
result.addDeclaration(d2); result.addDeclaration(d2);
return result; return result;
@ -2465,7 +2465,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(bt); IASTProblem p = failParse(bt);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CPPASTNode) pd).setOffsetAndLength((CPPASTNode) p); ((ASTNode) pd).setOffsetAndLength((ASTNode) p);
namespaceDefinition.addDeclaration(pd); namespaceDefinition.addDeclaration(pd);
errorHandling(); errorHandling();
if (checkToken == LA(1).hashCode()) if (checkToken == LA(1).hashCode())
@ -2478,7 +2478,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// consume the } // consume the }
int end = consume().getEndOffset(); int end = consume().getEndOffset();
((CPPASTNode) namespaceDefinition).setLength(end - first.getOffset()); ((ASTNode) namespaceDefinition).setLength(end - first.getOffset());
return namespaceDefinition; return namespaceDefinition;
} else if (LT(1) == IToken.tASSIGN) { } else if (LT(1) == IToken.tASSIGN) {
IToken assign = consume(); IToken assign = consume();
@ -2791,7 +2791,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (s != null) { if (s != null) {
funcDefinition.setBody(s); funcDefinition.setBody(s);
} }
((CPPASTNode) funcDefinition).setLength(calculateEndOffset(s) - firstOffset); ((ASTNode) funcDefinition).setLength(calculateEndOffset(s) - firstOffset);
if (hasFunctionTryBlock && declarator instanceof ICPPASTFunctionTryBlockDeclarator) { if (hasFunctionTryBlock && declarator instanceof ICPPASTFunctionTryBlockDeclarator) {
List handlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE); List handlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE);
@ -2799,7 +2799,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
for (int i = 0; i < handlers.size(); ++i) { for (int i = 0; i < handlers.size(); ++i) {
ICPPASTCatchHandler handler = (ICPPASTCatchHandler) handlers.get(i); ICPPASTCatchHandler handler = (ICPPASTCatchHandler) handlers.get(i);
((ICPPASTFunctionTryBlockDeclarator) declarator).addCatchHandler(handler); ((ICPPASTFunctionTryBlockDeclarator) declarator).addCatchHandler(handler);
((CPPASTNode) funcDefinition).setLength(calculateEndOffset(handler) - firstOffset); ((ASTNode) funcDefinition).setLength(calculateEndOffset(handler) - firstOffset);
} }
} }
return funcDefinition; return funcDefinition;
@ -3249,7 +3249,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
elabSpec.setStorageClass(storageClass); elabSpec.setStorageClass(storageClass);
elabSpec.setVirtual(isVirtual); elabSpec.setVirtual(isVirtual);
elabSpec.setExplicit(isExplicit); elabSpec.setExplicit(isExplicit);
((CPPASTNode) elabSpec).setOffsetAndLength(startOffset, calculateEndOffset(elabSpec) - startOffset); ((ASTNode) elabSpec).setOffsetAndLength(startOffset, calculateEndOffset(elabSpec) - startOffset);
return elabSpec; return elabSpec;
} }
if (enumSpec != null) { if (enumSpec != null) {
@ -3262,7 +3262,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
((ICPPASTDeclSpecifier) enumSpec).setExplicit(isExplicit); ((ICPPASTDeclSpecifier) enumSpec).setExplicit(isExplicit);
enumSpec.setInline(isInline); enumSpec.setInline(isInline);
enumSpec.setStorageClass(storageClass); enumSpec.setStorageClass(storageClass);
((CPPASTNode) enumSpec).setOffsetAndLength(startOffset, calculateEndOffset(enumSpec) - startOffset); ((ASTNode) enumSpec).setOffsetAndLength(startOffset, calculateEndOffset(enumSpec) - startOffset);
return (ICPPASTDeclSpecifier) enumSpec; return (ICPPASTDeclSpecifier) enumSpec;
} }
if (classSpec != null) { if (classSpec != null) {
@ -3275,7 +3275,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
classSpec.setStorageClass(storageClass); classSpec.setStorageClass(storageClass);
classSpec.setVirtual(isVirtual); classSpec.setVirtual(isVirtual);
classSpec.setExplicit(isExplicit); classSpec.setExplicit(isExplicit);
((CPPASTNode) classSpec).setOffsetAndLength(startOffset, calculateEndOffset(classSpec) - startOffset); ((ASTNode) classSpec).setOffsetAndLength(startOffset, calculateEndOffset(classSpec) - startOffset);
return classSpec; return classSpec;
} }
if (duple != null) { if (duple != null) {
@ -3292,7 +3292,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
nameSpec.setStorageClass(storageClass); nameSpec.setStorageClass(storageClass);
nameSpec.setVirtual(isVirtual); nameSpec.setVirtual(isVirtual);
nameSpec.setExplicit(isExplicit); nameSpec.setExplicit(isExplicit);
((CPPASTNode) nameSpec).setOffsetAndLength(startOffset, last.getEndOffset() - startOffset); ((ASTNode) nameSpec).setOffsetAndLength(startOffset, last.getEndOffset() - startOffset);
return nameSpec; return nameSpec;
} }
ICPPASTSimpleDeclSpecifier simpleDeclSpec = null; ICPPASTSimpleDeclSpecifier simpleDeclSpec = null;
@ -3716,7 +3716,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
before.getOffset(), before.getLength()); before.getOffset(), before.getLength());
IASTProblemTypeId typeIdProblem = createTypeIDProblem(); IASTProblemTypeId typeIdProblem = createTypeIDProblem();
typeIdProblem.setProblem(p); typeIdProblem.setProblem(p);
((CPPASTNode) typeIdProblem).setOffsetAndLength(((CPPASTNode) p)); ((ASTNode) typeIdProblem).setOffsetAndLength(((ASTNode) p));
exceptionSpecIds.add(typeIdProblem); exceptionSpecIds.add(typeIdProblem);
if (before == LA(1)) if (before == LA(1))
done = true; done = true;
@ -4035,7 +4035,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(bt); IASTProblem p = failParse(bt);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CPPASTNode) pd).setOffsetAndLength(((CPPASTNode) p)); ((ASTNode) pd).setOffsetAndLength(((ASTNode) p));
astClassSpecifier.addMemberDeclaration(pd); astClassSpecifier.addMemberDeclaration(pd);
if (checkToken == LA(1).hashCode()) if (checkToken == LA(1).hashCode())
errorHandling(); errorHandling();
@ -4211,7 +4211,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(bte); IASTProblem p = failParse(bte);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CPPASTNode) pd).setOffsetAndLength(((CPPASTNode) p)); ((ASTNode) pd).setOffsetAndLength(((ASTNode) p));
decl = pd; decl = pd;
} }
@ -4308,10 +4308,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
failParseWithErrorHandling(); failParseWithErrorHandling();
} catch (EndOfFileException e) { } catch (EndOfFileException e) {
if (translationUnit.getDeclarations().length != 0) { if (translationUnit.getDeclarations().length != 0) {
CPPASTNode d = (CPPASTNode) translationUnit.getDeclarations()[translationUnit.getDeclarations().length - 1]; ASTNode d = (ASTNode) translationUnit.getDeclarations()[translationUnit.getDeclarations().length - 1];
((CPPASTNode) translationUnit).setLength(d.getOffset() + d.getLength()); ((ASTNode) translationUnit).setLength(d.getOffset() + d.getLength());
} else } else
((CPPASTNode) translationUnit).setLength(0); ((ASTNode) translationUnit).setLength(0);
break; break;
} catch (BacktrackException b) { } catch (BacktrackException b) {
try { try {
@ -4319,7 +4319,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(b); IASTProblem p = failParse(b);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CPPASTNode) pd).setOffsetAndLength(((CPPASTNode) p)); ((ASTNode) pd).setOffsetAndLength(((ASTNode) p));
translationUnit.addDeclaration(pd); translationUnit.addDeclaration(pd);
errorHandling(); errorHandling();
} catch (EndOfFileException e) { } catch (EndOfFileException e) {
@ -4644,13 +4644,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
@Override @Override
protected IASTProblem createProblem(int signal, int offset, int length) { protected IASTProblem createProblem(int signal, int offset, int length) {
IASTProblem result = new CPPASTProblem(signal, EMPTY_STRING, false, true); IASTProblem result = new CPPASTProblem(signal, EMPTY_STRING, true);
((ASTNode) result).setOffsetAndLength(offset, length); ((ASTNode) result).setOffsetAndLength(offset, length);
((ASTNode) result).setLength(length); ((ASTNode) result).setLength(length);
return result; return result;
} }
@Override @Override
protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException {
int startOffset = consume().getOffset(); int startOffset = consume().getOffset();

View file

@ -1,13 +1,14 @@
############################################################################### ###############################################################################
# Copyright (c) 2005, 2007 IBM Corporation and others. # Copyright (c) 2005, 2008 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials # All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0 # are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at # which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html # http://www.eclipse.org/legal/epl-v10.html
# #
# Contributors: # Contributors:
# IBM Rational Software - Initial API and implementation # IBM Rational Software - Initial API and implementation
# Anton Leherbauer (Wind River Systems) # Anton Leherbauer (Wind River Systems)
# Markus Schorn (Wind River Systems)
############################################################################### ###############################################################################
IProblem.unknownFileName=<unknown> IProblem.unknownFileName=<unknown>
@ -26,12 +27,12 @@ QuickParseCallback.exception.constIterator=OffsetableIterator is a const iterato
ScannerProblemFactory.error.preproc.error=#error encountered with text: {0} ScannerProblemFactory.error.preproc.error=#error encountered with text: {0}
ScannerProblemFactory.error.preproc.warning=#warning encountered with text: {0} ScannerProblemFactory.error.preproc.warning=#warning encountered with text: {0}
ScannerProblemFactory.error.preproc.inclusionNotFound=Preprocessor Inclusion not found: {0} ScannerProblemFactory.error.preproc.inclusionNotFound=Unresolved inclusion: {0}
ScannerProblemFactory.error.preproc.definitionNotFound=Macro definition not found: {0} ScannerProblemFactory.error.preproc.definitionNotFound=Macro definition not found: {0}
ScannerProblemFactory.error.preproc.invalidMacroDefn=Macro definition malformed for macro: {0} ScannerProblemFactory.error.preproc.invalidMacroDefn=Macro definition malformed for macro: {0}
ScannerProblemFactory.error.preproc.invalidMacroRedefn=Invalid macro redefinition for macro : {0} ScannerProblemFactory.error.preproc.invalidMacroRedefn=Invalid macro redefinition for macro : {0}
ScannerProblemFactory.error.preproc.unbalancedConditional=Preprocessor Conditionals unbalanced : {0} ScannerProblemFactory.error.preproc.unbalancedConditional=Preprocessor conditionals unbalanced : {0}
ScannerProblemFactory.error.preproc.conditionalEval=Expression Evaluation error for condition : {0} ScannerProblemFactory.error.preproc.conditionalEval=Expression evaluation error for condition : {0}
ScannerProblemFactory.error.preproc.macroUsage=Macro usage error for macro : {0} ScannerProblemFactory.error.preproc.macroUsage=Macro usage error for macro : {0}
ScannerProblemFactory.error.preproc.circularInclusion=Circular inclusion for file : {0} ScannerProblemFactory.error.preproc.circularInclusion=Circular inclusion for file : {0}
ScannerProblemFactory.error.preproc.invalidDirective=Invalid preprocessor directive : {0} ScannerProblemFactory.error.preproc.invalidDirective=Invalid preprocessor directive : {0}
@ -54,7 +55,7 @@ ScannerProblemFactory.error.scanner.badConditionalExpression=Bad conditional exp
ScannerProblemFactory.error.scanner.unexpectedEOF=Unexpected End Of File encountered ScannerProblemFactory.error.scanner.unexpectedEOF=Unexpected End Of File encountered
ScannerProblemFactory.error.scanner.badCharacter=Bad character sequence encountered : {0} ScannerProblemFactory.error.scanner.badCharacter=Bad character sequence encountered : {0}
ParserProblemFactory.error.syntax.syntaxError=Syntax error encountered ParserProblemFactory.error.syntax.syntaxError=Syntax error
ASTProblemFactory.error.semantic.uniqueNamePredefined=Attempt to introduce unique symbol failed : {0} ASTProblemFactory.error.semantic.uniqueNamePredefined=Attempt to introduce unique symbol failed : {0}
ASTProblemFactory.error.semantic.nameNotFound=Attempt to use symbol failed : {0} ASTProblemFactory.error.semantic.nameNotFound=Attempt to use symbol failed : {0}
@ -64,8 +65,7 @@ ASTProblemFactory.error.semantic.malformedExpression=Malformed expression
LineOffsetReconciler.error.couldNotResetReader=Could not reset Reader LineOffsetReconciler.error.couldNotResetReader=Could not reset Reader
BaseProblemFactory.problemPattern={0} in file: {1} on line: {2, number, integer}. BaseProblemFactory.problemPattern={0} in file: {1}:{2, number, integer}.
BaseProblemFactory.astProblemPattern={0} in file: {1} at offset: {2, number, integer}.
ASTProblemFactory.error.semantic.pst.ambiguousLookup=Ambiguity encountered during lookup: {0} ASTProblemFactory.error.semantic.pst.ambiguousLookup=Ambiguity encountered during lookup: {0}
ASTProblemFactory.error.semantic.pst.invalidType=Invalid type encountered in: {0} ASTProblemFactory.error.semantic.pst.invalidType=Invalid type encountered in: {0}

View file

@ -1,235 +0,0 @@
/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation 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
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.parser.scanner;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
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 ASTPreprocessorNode implements IASTProblem {
private final int id;
private final char[] arg;
private String message = null;
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;
}
public int getID() {
return id;
}
public boolean isError() {
return false;
}
public boolean isWarning() {
return true;
}
public String getMessage() {
if (message != null)
return message;
String msg = errorMessages.get(new Integer(id));
if (msg == null)
msg = ""; //$NON-NLS-1$
if (arg != null) {
msg = MessageFormat.format(msg, new Object[] { new String(arg) });
}
IASTFileLocation f = getFileLocation();
String file = null;
int line = 0;
if( f == null )
{
file = ""; //$NON-NLS-1$
} else {
file = f.getFileName();
line = f.getStartingLineNumber();
}
Object[] args = new Object[] { msg, file, new Integer(line) };
message = ParserMessages.getFormattedString(PROBLEM_PATTERN, args);
return message;
}
public boolean checkCategory(int bitmask) {
return ((id & bitmask) != 0);
}
public String getArguments() {
return arg != null ? String.valueOf(arg) : ""; //$NON-NLS-1$
}
protected static final Map<Integer, String> errorMessages;
static {
errorMessages = new HashMap<Integer, String>();
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_POUND_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.error")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.PREPROCESSOR_POUND_WARNING), ParserMessages
.getString("ScannerProblemFactory.error.preproc.warning")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.inclusionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_DEFINITION_NOT_FOUND),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.definitionNotFound")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_DEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroDefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_MACRO_REDEFN),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidMacroRedefn")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_UNBALANCE_CONDITION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.unbalancedConditional")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_CONDITIONAL_EVAL_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.conditionalEval")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_USAGE_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroUsage")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_CIRCULAR_INCLUSION),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.circularInclusion")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_DIRECTIVE),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidDirective")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_MACRO_PASTING_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.macroPasting")); //$NON-NLS-1$
errorMessages
.put(
new Integer(
IASTProblem.PREPROCESSOR_MISSING_RPAREN_PARMLIST),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.PREPROCESSOR_INVALID_VA_ARGS),
ParserMessages
.getString("ScannerProblemFactory.error.preproc.invalidVaArgs")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_INVALID_ESCAPECHAR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.invalidEscapeChar")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNBOUNDED_STRING),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unboundedString")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_FLOATING_POINT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badFloatingPoint")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_HEX_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badHexFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_OCTAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badOctalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_DECIMAL_FORMAT),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badDecimalFormat")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ASSIGNMENT_NOT_ALLOWED),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.assignmentNotAllowed")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_DIVIDE_BY_ZERO),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.divideByZero")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_MISSING_R_PAREN),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.missingRParen")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_EXPRESSION_SYNTAX_ERROR),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.expressionSyntaxError")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_ILLEGAL_IDENTIFIER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.illegalIdentifier")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CONDITIONAL_EXPRESSION),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badConditionalExpression")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_UNEXPECTED_EOF),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.unexpectedEOF")); //$NON-NLS-1$
errorMessages
.put(
new Integer(IASTProblem.SCANNER_BAD_CHARACTER),
ParserMessages
.getString("ScannerProblemFactory.error.scanner.badCharacter")); //$NON-NLS-1$
errorMessages.put(new Integer(IASTProblem.SYNTAX_ERROR), ParserMessages
.getString("ParserProblemFactory.error.syntax.syntaxError")); //$NON-NLS-1$
}
protected final static String PROBLEM_PATTERN = "BaseProblemFactory.problemPattern"; //$NON-NLS-1$
}

View file

@ -769,7 +769,8 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
return -1; return -1;
} }
public String toString() { @Override
public String toString() {
StringBuffer buffer = new StringBuffer("Scanner @ file:"); //$NON-NLS-1$ StringBuffer buffer = new StringBuffer("Scanner @ file:"); //$NON-NLS-1$
buffer.append(fCurrentContext.toString()); buffer.append(fCurrentContext.toString());
buffer.append(" line: "); //$NON-NLS-1$ buffer.append(" line: "); //$NON-NLS-1$
@ -1030,7 +1031,15 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
} }
} }
else { else {
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, headerName, poundOffset, condEndOffset); final int len = headerName.length+2;
StringBuilder name= new StringBuilder(len);
name.append(userInclude ? '"' : '<');
name.append(headerName);
name.append(userInclude ? '"' : '>');
final char[] nameChars= new char[len];
name.getChars(0, len, nameChars, 0);
handleProblem(IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, nameChars, poundOffset, condEndOffset);
} }
} }

View file

@ -64,6 +64,11 @@ public interface ILocationResolver {
*/ */
IASTProblem[] getScannerProblems(); IASTProblem[] getScannerProblems();
/**
* @see IASTTranslationUnit#getPreprocessorProblemsCount()
*/
int getScannerProblemsCount();
/** /**
* Returns the comments encountered. * Returns the comments encountered.
*/ */

View file

@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IMacroBinding; 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;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ASTProblem;
/** /**
* Converts the offsets relative to various contexts to the global sequence number. Also creates and stores * Converts the offsets relative to various contexts to the global sequence number. Also creates and stores
@ -217,7 +218,7 @@ public class LocationMap implements ILocationResolver {
public void encounterProblem(int id, char[] arg, int offset, int endOffset) { public void encounterProblem(int id, char[] arg, int offset, int endOffset) {
offset= getSequenceNumberForOffset(offset); offset= getSequenceNumberForOffset(offset);
endOffset= getSequenceNumberForOffset(endOffset); endOffset= getSequenceNumberForOffset(endOffset);
ASTProblem problem = new ASTProblem(fTranslationUnit, id, arg, offset, endOffset); ASTProblem problem = new ASTProblem(fTranslationUnit, IASTTranslationUnit.SCANNER_PROBLEM, id, arg, false, offset, endOffset);
fProblems.add(problem); fProblems.add(problem);
} }
@ -545,6 +546,9 @@ public class LocationMap implements ILocationResolver {
return fProblems.toArray(new IASTProblem[fProblems.size()]); return fProblems.toArray(new IASTProblem[fProblems.size()]);
} }
public int getScannerProblemsCount() {
return fProblems.size();
}
public IASTName[] getDeclarations(IMacroBinding binding) { public IASTName[] getDeclarations(IMacroBinding binding) {
IASTPreprocessorMacroDefinition def = getMacroDefinition(binding); IASTPreprocessorMacroDefinition def = getMacroDefinition(binding);

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others. * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -19,5 +19,7 @@ public class IndexerStatistics {
public int fReferenceCount= 0; public int fReferenceCount= 0;
public int fDeclarationCount= 0; public int fDeclarationCount= 0;
public int fProblemBindingCount= 0; public int fProblemBindingCount= 0;
public int fUnresolvedIncludes= 0; public int fUnresolvedIncludesCount= 0;
public int fPreprocessorProblemCount= 0;
public int fSyntaxProblemsCount= 0;
} }

View file

@ -17,6 +17,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -27,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ICompositeType;
@ -68,8 +70,11 @@ abstract public class PDOMWriter {
ArrayList<IASTPreprocessorMacroDefinition> fMacros= new ArrayList<IASTPreprocessorMacroDefinition>(); ArrayList<IASTPreprocessorMacroDefinition> fMacros= new ArrayList<IASTPreprocessorMacroDefinition>();
ArrayList<IASTPreprocessorIncludeStatement> fIncludes= new ArrayList<IASTPreprocessorIncludeStatement>(); ArrayList<IASTPreprocessorIncludeStatement> fIncludes= new ArrayList<IASTPreprocessorIncludeStatement>();
} }
private boolean fShowProblems;
private boolean fShowInclusionProblems;
private boolean fShowScannerProblems;
private boolean fShowSyntaxProblems;
protected boolean fShowActivity; protected boolean fShowActivity;
protected boolean fShowProblems;
protected final IndexerStatistics fStatistics; protected final IndexerStatistics fStatistics;
protected final IndexerInputAdapter fResolver; protected final IndexerInputAdapter fResolver;
@ -85,6 +90,18 @@ abstract public class PDOMWriter {
fShowActivity= val; fShowActivity= val;
} }
public void setShowInclusionProblems(boolean val) {
fShowInclusionProblems= val;
}
public void setShowScannerProblems(boolean val) {
fShowScannerProblems= val;
}
public void setShowSyntaxProblems(boolean val) {
fShowSyntaxProblems= val;
}
public void setShowProblems(boolean val) { public void setShowProblems(boolean val) {
fShowProblems= val; fShowProblems= val;
} }
@ -116,6 +133,11 @@ abstract public class PDOMWriter {
public void addSymbols(IASTTranslationUnit ast, IIndexFileLocation[] ifls, IWritableIndex index, public void addSymbols(IASTTranslationUnit ast, IIndexFileLocation[] ifls, IWritableIndex index,
int readlockCount, boolean flushIndex, int configHash, ITodoTaskUpdater taskUpdater, IProgressMonitor pm) int readlockCount, boolean flushIndex, int configHash, ITodoTaskUpdater taskUpdater, IProgressMonitor pm)
throws InterruptedException, CoreException { throws InterruptedException, CoreException {
if (fShowProblems) {
fShowInclusionProblems= true;
fShowScannerProblems= true;
fShowSyntaxProblems= true;
}
final Map<IIndexFileLocation, Symbols> symbolMap= new HashMap<IIndexFileLocation, Symbols>(); final Map<IIndexFileLocation, Symbols> symbolMap= new HashMap<IIndexFileLocation, Symbols>();
for (int i = 0; i < ifls.length; i++) { for (int i = 0; i < ifls.length; i++) {
prepareInMap(symbolMap, ifls[i]); prepareInMap(symbolMap, ifls[i]);
@ -209,8 +231,12 @@ abstract public class PDOMWriter {
final IASTName name = na[0]; final IASTName name = na[0];
try { try {
final IBinding binding = name.resolveBinding(); final IBinding binding = name.resolveBinding();
if (binding instanceof IProblemBinding) if (binding instanceof IProblemBinding) {
reportProblem((IProblemBinding) binding); fStatistics.fProblemBindingCount++;
if (fShowProblems) {
reportProblem((IProblemBinding) binding);
}
}
else if (name.isReference()) { else if (name.isReference()) {
if (fSkipReferences == SKIP_TYPE_REFERENCES) { if (fSkipReferences == SKIP_TYPE_REFERENCES) {
if (isTypeReferenceBinding(binding) && !isRequiredReference(name)) { if (isTypeReferenceBinding(binding) && !isRequiredReference(name)) {
@ -249,6 +275,7 @@ abstract public class PDOMWriter {
final IIndexFileLocation astIFL = fResolver.resolveASTPath(ast.getFilePath()); final IIndexFileLocation astIFL = fResolver.resolveASTPath(ast.getFilePath());
// includes // includes
int unresolvedIncludes= 0;
IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives(); IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
for (int i= 0; i < includes.length; i++) { for (int i= 0; i < includes.length; i++) {
final IASTPreprocessorIncludeStatement include = includes[i]; final IASTPreprocessorIncludeStatement include = includes[i];
@ -260,7 +287,7 @@ abstract public class PDOMWriter {
} }
if (include.isActive()) { if (include.isActive()) {
if (!include.isResolved()) { if (!include.isResolved()) {
reportProblem(include); unresolvedIncludes++;
} }
else if (updateSource) { else if (updateSource) {
// the include was parsed, check if we want to update the included file in the index // the include was parsed, check if we want to update the included file in the index
@ -284,7 +311,7 @@ abstract public class PDOMWriter {
} }
// names // names
ast.accept(new IndexerASTVisitor() { final IndexerASTVisitor visitor = new IndexerASTVisitor() {
@Override @Override
public void visit(IASTName name, IASTName caller) { public void visit(IASTName name, IASTName caller) {
if (fSkipReferences == SKIP_ALL_REFERENCES) { if (fSkipReferences == SKIP_ALL_REFERENCES) {
@ -305,7 +332,28 @@ abstract public class PDOMWriter {
} }
} }
} }
}); };
ast.accept(visitor);
fStatistics.fUnresolvedIncludesCount += unresolvedIncludes;
fStatistics.fPreprocessorProblemCount+= ast.getPreprocessorProblemsCount() - unresolvedIncludes;
if (fShowScannerProblems || fShowSyntaxProblems) {
final boolean reportAll= fShowScannerProblems && fShowSyntaxProblems;
IASTProblem[] scannerProblems= ast.getPreprocessorProblems();
for (IASTProblem problem : scannerProblems) {
if (reportAll || (problem.getID() == IASTProblem.PREPROCESSOR_INCLUSION_NOT_FOUND) == fShowInclusionProblems) {
reportProblem(problem);
}
}
}
final List<IASTProblem> problems= visitor.getProblems();
fStatistics.fSyntaxProblemsCount+= problems.size();
if (fShowSyntaxProblems) {
for (IASTProblem problem : problems) {
reportProblem(problem);
}
}
} }
protected final boolean isRequiredReference(IASTName name) { protected final boolean isRequiredReference(IASTName name) {
@ -335,30 +383,6 @@ abstract public class PDOMWriter {
return false; return false;
} }
private void reportProblem(IASTPreprocessorIncludeStatement problem) {
fStatistics.fUnresolvedIncludes++;
if (fShowProblems) {
String msg= "Indexer: unresolved include"; //$NON-NLS-1$
IASTFileLocation loc= problem.getFileLocation();
if (loc != null && loc.getFileName() != null) {
msg += " at " + loc.getFileName() + ": " + loc.getStartingLineNumber(); //$NON-NLS-1$ //$NON-NLS-2$
}
System.out.println(msg);
}
}
private void reportProblem(IProblemBinding problem) {
fStatistics.fProblemBindingCount++;
if (fShowProblems) {
String msg= "Indexer: problem at "+ problem.getFileName() + ": " + problem.getLineNumber(); //$NON-NLS-1$//$NON-NLS-2$
String pmsg= problem.getMessage();
if (pmsg != null && pmsg.length() > 0)
msg+= "; " + problem.getMessage(); //$NON-NLS-1$
System.out.println(msg);
}
}
private void addToMap(Map<IIndexFileLocation, Symbols> map, IIndexFileLocation location, IASTName[] thing) { private void addToMap(Map<IIndexFileLocation, Symbols> map, IIndexFileLocation location, IASTName[] thing) {
Symbols lists= map.get(location); Symbols lists= map.get(location);
if (lists != null) if (lists != null)
@ -444,4 +468,22 @@ abstract public class PDOMWriter {
fInfo.fTotalSourcesEstimate+= totalEstimate; fInfo.fTotalSourcesEstimate+= totalEstimate;
} }
} }
private String getLocationInfo(String filename, int lineNumber) {
return " at " + filename + "(" + lineNumber + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
private void reportProblem(IProblemBinding problem) {
String msg= "Indexer: unresolved name" + getLocationInfo(problem.getFileName(), problem.getLineNumber()); //$NON-NLS-1$
String pmsg= problem.getMessage();
if (pmsg != null && pmsg.length() > 0)
msg+= "; " + problem.getMessage(); //$NON-NLS-1$
System.out.println(msg);
}
private void reportProblem(IASTProblem problem) {
String msg= "Indexer: " + problem.getMessage(); //$NON-NLS-1$
System.out.println(msg);
}
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2008 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -12,6 +12,7 @@
package org.eclipse.cdt.internal.core.pdom.indexer; package org.eclipse.cdt.internal.core.pdom.indexer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@ -22,25 +23,42 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
abstract public class IndexerASTVisitor extends ASTVisitor { abstract public class IndexerASTVisitor extends ASTVisitor {
private static class Definition {
Definition(IASTName name, IASTNode node) {
fName= name;
fNode= node;
}
IASTName fName;
IASTNode fNode;
}
private IASTName fDefinitionName; private IASTName fDefinitionName;
private IASTNode fDefinitionNode; private IASTNode fDefinitionNode;
private ArrayList fStack= new ArrayList(); private ArrayList<Definition> fStack= new ArrayList<Definition>();
private ArrayList<IASTProblem> fProblems= new ArrayList<IASTProblem>();
public IndexerASTVisitor() { public IndexerASTVisitor() {
shouldVisitNames= true; shouldVisitNames= true;
shouldVisitDeclarations= true; shouldVisitDeclarations= true;
shouldVisitInitializers= true; shouldVisitInitializers= true;
shouldVisitDeclSpecifiers= true; shouldVisitDeclSpecifiers= true;
shouldVisitProblems= true;
}
public List<IASTProblem> getProblems() {
return fProblems;
} }
abstract public void visit(IASTName name, IASTName definitionName); abstract public void visit(IASTName name, IASTName definitionName);
@Override
final public int visit(IASTName name) { final public int visit(IASTName name) {
if (!(name instanceof ICPPASTQualifiedName)) { if (!(name instanceof ICPPASTQualifiedName)) {
if (name != fDefinitionName) { if (name != fDefinitionName) {
@ -52,7 +70,7 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
private void push(IASTName name, IASTNode node) { private void push(IASTName name, IASTNode node) {
if (fDefinitionName != null) { if (fDefinitionName != null) {
fStack.add(new Object[] {fDefinitionName, fDefinitionNode}); fStack.add(new Definition(fDefinitionName, fDefinitionNode));
} }
name = getLastInQualified(name); name = getLastInQualified(name);
fDefinitionName= name; fDefinitionName= name;
@ -73,14 +91,15 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
fDefinitionNode= null; fDefinitionNode= null;
} }
else { else {
Object[] old= (Object[]) fStack.remove(fStack.size()-1); Definition old= fStack.remove(fStack.size()-1);
fDefinitionName= (IASTName) old[0]; fDefinitionName= old.fName;
fDefinitionNode= (IASTNode) old[1]; fDefinitionNode= old.fNode;
} }
} }
} }
// functions and methods // functions and methods
@Override
public int visit(IASTDeclaration decl) { public int visit(IASTDeclaration decl) {
if (decl instanceof IASTFunctionDefinition) { if (decl instanceof IASTFunctionDefinition) {
IASTFunctionDefinition fdef= (IASTFunctionDefinition) decl; IASTFunctionDefinition fdef= (IASTFunctionDefinition) decl;
@ -111,12 +130,14 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
@Override
public int leave(IASTDeclaration decl) { public int leave(IASTDeclaration decl) {
pop(decl); pop(decl);
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
// class definitions, typedefs // class definitions, typedefs
@Override
public int visit(IASTDeclSpecifier declspec) { public int visit(IASTDeclSpecifier declspec) {
if (declspec instanceof ICPPASTCompositeTypeSpecifier) { if (declspec instanceof ICPPASTCompositeTypeSpecifier) {
ICPPASTCompositeTypeSpecifier cts= (ICPPASTCompositeTypeSpecifier) declspec; ICPPASTCompositeTypeSpecifier cts= (ICPPASTCompositeTypeSpecifier) declspec;
@ -133,12 +154,20 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
@Override
public int leave(IASTDeclSpecifier declspec) { public int leave(IASTDeclSpecifier declspec) {
pop(declspec); pop(declspec);
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
@Override
public int visit(IASTProblem problem) {
fProblems.add(problem);
return PROCESS_SKIP;
}
// variable and field initializers // variable and field initializers
@Override
public int visit(IASTInitializer initializer) { public int visit(IASTInitializer initializer) {
if (!(fDefinitionNode instanceof IASTFunctionDefinition)) { if (!(fDefinitionNode instanceof IASTFunctionDefinition)) {
IASTNode cand= initializer.getParent(); IASTNode cand= initializer.getParent();
@ -149,6 +178,7 @@ abstract public class IndexerASTVisitor extends ASTVisitor {
return PROCESS_CONTINUE; return PROCESS_CONTINUE;
} }
@Override
public int leave(IASTInitializer initializer) { public int leave(IASTInitializer initializer) {
pop(initializer); pop(initializer);
return PROCESS_CONTINUE; return PROCESS_CONTINUE;

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2008 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -32,6 +32,7 @@ import org.eclipse.cdt.internal.core.pdom.AbstractIndexerTask;
import org.eclipse.cdt.internal.core.pdom.ITodoTaskUpdater; import org.eclipse.cdt.internal.core.pdom.ITodoTaskUpdater;
import org.eclipse.cdt.internal.core.pdom.IndexerProgress; import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache; import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -52,6 +53,9 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
super(concat(addFiles, updateFiles), removeFiles, new ProjectIndexerInputAdapter(indexer.getProject()), isFastIndexer); super(concat(addFiles, updateFiles), removeFiles, new ProjectIndexerInputAdapter(indexer.getProject()), isFastIndexer);
fIndexer= indexer; fIndexer= indexer;
setShowActivity(checkDebugOption(TRACE_ACTIVITY, TRUE)); setShowActivity(checkDebugOption(TRACE_ACTIVITY, TRUE));
setShowInclusionProblems(checkDebugOption(TRACE_INCLUSION_PROBLEMS, TRUE));
setShowScannerProblems(checkDebugOption(TRACE_SCANNER_PROBLEMS, TRUE));
setShowSyntaxProblems(checkDebugOption(TRACE_SYNTAX_PROBLEMS, TRUE));
setShowProblems(checkDebugOption(TRACE_PROBLEMS, TRUE)); setShowProblems(checkDebugOption(TRACE_PROBLEMS, TRUE));
if (checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES)) { if (checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES)) {
setSkipReferences(SKIP_ALL_REFERENCES); setSkipReferences(SKIP_ALL_REFERENCES);
@ -145,7 +149,9 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
IScannerInfoProvider provider= CCorePlugin.getDefault().getScannerInfoProvider(project); IScannerInfoProvider provider= CCorePlugin.getDefault().getScannerInfoProvider(project);
IScannerInfo scanInfo; IScannerInfo scanInfo;
if (provider != null) { if (provider != null) {
scanInfo= provider.getScannerInformation(project); String filename= linkageID == ILinkage.C_LINKAGE_ID ? "__cdt__.c" : "__cdt__.cpp"; //$NON-NLS-1$//$NON-NLS-2$
IFile file= project.getFile(filename);
scanInfo= provider.getScannerInformation(file);
} }
else { else {
scanInfo= new ScannerInfo(); scanInfo= new ScannerInfo();
@ -175,18 +181,20 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
protected void traceEnd(long start, IWritableIndex index) { protected void traceEnd(long start, IWritableIndex index) {
if (checkDebugOption(IPDOMIndexerTask.TRACE_STATISTICS, TRUE)) { if (checkDebugOption(IPDOMIndexerTask.TRACE_STATISTICS, TRUE)) {
IndexerProgress info= getProgressInformation(); IndexerProgress info= getProgressInformation();
String name= getClass().getName(); String kind= getIndexer().getClass().getName();
name= name.substring(name.lastIndexOf('.')+1); kind= kind.substring(kind.lastIndexOf('.')+1);
String name= " "; //$NON-NLS-1$
System.out.println(name + " " + getProject().getElementName() //$NON-NLS-1$ System.out.println("C/C++ Indexer: Project '" + getProject().getElementName() //$NON-NLS-1$
+ " (" + info.fCompletedSources + " sources, " //$NON-NLS-1$ //$NON-NLS-2$ + "' (" + info.fCompletedSources + " sources, " //$NON-NLS-1$ //$NON-NLS-2$
+ info.fCompletedHeaders + " headers)"); //$NON-NLS-1$ + info.fCompletedHeaders + " headers)"); //$NON-NLS-1$
boolean allFiles= getIndexAllFiles(); boolean allFiles= getIndexAllFiles();
boolean skipRefs= checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES); boolean skipRefs= checkProperty(IndexerPreferences.KEY_SKIP_ALL_REFERENCES);
boolean skipTypeRefs= skipRefs || checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES); boolean skipTypeRefs= skipRefs || checkProperty(IndexerPreferences.KEY_SKIP_TYPE_REFERENCES);
System.out.println(name + " Options: " //$NON-NLS-1$ System.out.println(name + " Options: " //$NON-NLS-1$
+ "parseAllFiles=" + allFiles //$NON-NLS-1$ + "indexer='" + kind //$NON-NLS-1$
+ ",skipReferences=" + skipRefs //$NON-NLS-1$ + "', parseAllFiles=" + allFiles //$NON-NLS-1$
+ ", skipReferences=" + skipRefs //$NON-NLS-1$
+ ", skipTypeReferences=" + skipTypeRefs //$NON-NLS-1$ + ", skipTypeReferences=" + skipTypeRefs //$NON-NLS-1$
+ "."); //$NON-NLS-1$ + "."); //$NON-NLS-1$
System.out.println(name + " Timings: " //$NON-NLS-1$ System.out.println(name + " Timings: " //$NON-NLS-1$
@ -195,18 +203,20 @@ public abstract class PDOMIndexerTask extends AbstractIndexerTask implements IPD
+ fStatistics.fResolutionTime + " resolution, " //$NON-NLS-1$ + fStatistics.fResolutionTime + " resolution, " //$NON-NLS-1$
+ fStatistics.fAddToIndexTime + " index update."); //$NON-NLS-1$ + fStatistics.fAddToIndexTime + " index update."); //$NON-NLS-1$
System.out.println(name + " Errors: " //$NON-NLS-1$ System.out.println(name + " Errors: " //$NON-NLS-1$
+ fStatistics.fUnresolvedIncludes + " unresolved includes, " //$NON-NLS-1$ + fStatistics.fUnresolvedIncludesCount + " include, " //$NON-NLS-1$
+ fStatistics.fErrorCount + " unexpected errors."); //$NON-NLS-1$ + fStatistics.fPreprocessorProblemCount + " scanner, " //$NON-NLS-1$
+ fStatistics.fSyntaxProblemsCount + " syntax, " //$NON-NLS-1$
+ fStatistics.fErrorCount + " internal errors."); //$NON-NLS-1$
int sum= fStatistics.fDeclarationCount+fStatistics.fReferenceCount+fStatistics.fProblemBindingCount; int sum= fStatistics.fDeclarationCount+fStatistics.fReferenceCount+fStatistics.fProblemBindingCount;
double problemPct= sum==0 ? 0.0 : (double) fStatistics.fProblemBindingCount / (double) sum; double problemPct= sum==0 ? 0.0 : (double) fStatistics.fProblemBindingCount / (double) sum;
NumberFormat nf= NumberFormat.getPercentInstance(); NumberFormat nf= NumberFormat.getPercentInstance();
nf.setMaximumFractionDigits(2); nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2); nf.setMinimumFractionDigits(2);
System.out.println(name + " Result: " //$NON-NLS-1$ System.out.println(name + " Names: " //$NON-NLS-1$
+ fStatistics.fDeclarationCount + " declarations, " //$NON-NLS-1$ + fStatistics.fDeclarationCount + " declarations, " //$NON-NLS-1$
+ fStatistics.fReferenceCount + " references, " //$NON-NLS-1$ + fStatistics.fReferenceCount + " references, " //$NON-NLS-1$
+ fStatistics.fProblemBindingCount + "(" + nf.format(problemPct) + ") problems."); //$NON-NLS-1$ //$NON-NLS-2$ + fStatistics.fProblemBindingCount + "(" + nf.format(problemPct) + ") unresolved."); //$NON-NLS-1$ //$NON-NLS-2$
if (index != null) { if (index != null) {
long misses= index.getCacheMisses(); long misses= index.getCacheMisses();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2008 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -314,8 +314,13 @@ public class BaseUITestCase extends BaseTestCase {
if (text.length() > 0 && !text.equals("...")) { if (text.length() > 0 && !text.equals("...")) {
item= root.getItem(i1); item= root.getItem(i1);
assertNotNull("Unexpected tree node " + item.getText(), label); assertNotNull("Unexpected tree node " + item.getText(), label);
assertEquals(label, item.getText()); if (label.equals(item.getText())) {
return item; return item;
}
if (i > 100) {
assertEquals(label, item.getText());
return item;
}
} }
} }
catch (IllegalArgumentException e) { catch (IllegalArgumentException e) {
@ -330,6 +335,7 @@ public class BaseUITestCase extends BaseTestCase {
} }
runEventQueue(10); runEventQueue(10);
} }
runEventQueue(30000);
fail("Timeout expired waiting for tree node " + label + "{" + i0 + "," + i1 + "}"); fail("Timeout expired waiting for tree node " + label + "{" + i0 + "," + i1 + "}");
return null; return null;
} }