/******************************************************************************* * Copyright (c) 2000, 2011 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); } }