/*******************************************************************************
* Copyright (c) 2000, 2009 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.dom;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.core.compiler.IProblem;
/**
* Internal AST visitor for propagating syntax errors.
*/
class ASTSyntaxErrorPropagator extends ASTVisitor {
private CategorizedProblem[] problems;
ASTSyntaxErrorPropagator(CategorizedProblem[] problems) {
// visit Javadoc.tags() as well
super(true);
this.problems= problems;
}
private boolean checkAndTagAsMalformed(ASTNode node) {
boolean tagWithErrors= false;
search: for (int i= 0, max= this.problems.length; i < max; i++) {
CategorizedProblem problem= this.problems[i];
switch (problem.getID()) {
case IProblem.ParsingErrorOnKeywordNoSuggestion:
case IProblem.ParsingErrorOnKeyword:
case IProblem.ParsingError:
case IProblem.ParsingErrorNoSuggestion:
case IProblem.ParsingErrorInsertTokenBefore:
case IProblem.ParsingErrorInsertTokenAfter:
case IProblem.ParsingErrorDeleteToken:
case IProblem.ParsingErrorDeleteTokens:
case IProblem.ParsingErrorMergeTokens:
case IProblem.ParsingErrorInvalidToken:
case IProblem.ParsingErrorMisplacedConstruct:
case IProblem.ParsingErrorReplaceTokens:
case IProblem.ParsingErrorNoSuggestionForTokens:
case IProblem.ParsingErrorUnexpectedEOF:
case IProblem.ParsingErrorInsertToComplete:
case IProblem.ParsingErrorInsertToCompleteScope:
case IProblem.ParsingErrorInsertToCompletePhrase:
case IProblem.EndOfSource:
case IProblem.InvalidHexa:
case IProblem.InvalidOctal:
case IProblem.InvalidCharacterConstant:
case IProblem.InvalidEscape:
case IProblem.InvalidInput:
case IProblem.InvalidUnicodeEscape:
case IProblem.InvalidFloat:
case IProblem.NullSourceString:
case IProblem.UnterminatedString:
case IProblem.UnterminatedComment:
case IProblem.InvalidDigit:
break;
default:
continue search;
}
int position= problem.getSourceStart();
int start= node.getStartPosition();
int end= start + node.getLength();
if ((start <= position) && (position <= end)) {
node.setFlags(node.getFlags() | ASTNode.MALFORMED);
// clear the bits on parent
ASTNode currentNode= node.getParent();
while (currentNode != null) {
currentNode.setFlags(currentNode.getFlags() & ~ASTNode.MALFORMED);
currentNode= currentNode.getParent();
}
tagWithErrors= true;
}
}
return tagWithErrors;
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(FieldDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(MethodDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(PackageDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(ImportDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(CompilationUnit node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(AnnotationTypeDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(EnumDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(TypeDeclaration node) {
return checkAndTagAsMalformed(node);
}
/*
* Method declared on ASTVisitor.
*/
public boolean visit(Initializer node) {
return checkAndTagAsMalformed(node);
}
}