blob: f64da38bffa3ee464aeacab455eb71c759e14691 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}