/*******************************************************************************
* Copyright (c) 2008, 2013 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences 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:
* Institute for Software - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite.commenthandler;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompositeTypeSpecifier;
/**
* A visitor for the comments. Calls the NodeCommenter to assign the comments.
*
* @see org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommenter
*
* @author Guido Zgraggen IFS
*/
public class ASTCommenterVisitor extends ASTVisitor {
protected CommentHandler commentHandler;
protected NodeCommentMap commentMap;
private NodeCommenter nodeCommenter;
private IASTDeclaration lastDecl;
{
shouldVisitBaseSpecifiers = true;
shouldVisitDeclarations = true;
shouldVisitDeclarators = true;
shouldVisitDeclSpecifiers = true;
shouldVisitExpressions = true;
shouldVisitInitializers = true;
shouldVisitNames = true;
shouldVisitNamespaces = true;
shouldVisitParameterDeclarations = true;
shouldVisitStatements = true;
shouldVisitTemplateParameters = true;
shouldVisitTypeIds = true;
shouldVisitTranslationUnit = true;
}
public ASTCommenterVisitor(CommentHandler commentHandler, NodeCommentMap commentMap) {
this.commentHandler = commentHandler;
this.commentMap = commentMap;
init();
}
private void init() {
nodeCommenter = new NodeCommenter(this, commentHandler, commentMap);
}
@Override
public int visit(IASTName name) {
return nodeCommenter.appendComments((ASTNode) name);
}
@Override
public int visit(IASTDeclSpecifier declSpec) {
return nodeCommenter.appendComments((ASTNode) declSpec);
}
@Override
public int visit(IASTExpression expression) {
return nodeCommenter.appendComments((ASTNode) expression);
}
@Override
public int visit(IASTStatement statement) {
return nodeCommenter.appendComments((ASTNode) statement);
}
@Override
public int visit(IASTTypeId typeId) {
return nodeCommenter.appendComments((ASTNode) typeId);
}
@Override
public int visit(IASTDeclaration declaration) {
if (ASTCommenter.isInWorkspace(declaration)) {
return nodeCommenter.appendComments((ASTNode) declaration);
}
return PROCESS_SKIP;
}
@Override
public int visit(IASTDeclarator declarator) {
return nodeCommenter.appendComments((ASTNode) declarator);
}
@Override
public int visit(IASTInitializer initializer) {
return nodeCommenter.appendComments((ASTNode) initializer);
}
@Override
public int visit(IASTParameterDeclaration parameterDeclaration) {
return nodeCommenter.appendComments((ASTNode) parameterDeclaration);
}
@Override
public int visit(ICPPASTNamespaceDefinition namespace) {
return nodeCommenter.appendComments((ASTNode) namespace);
}
@Override
public int visit(ICPPASTTemplateParameter parameter) {
return nodeCommenter.appendComments((ASTNode) parameter);
}
@Override
public int leave(IASTTranslationUnit tu) {
nodeCommenter.appendComments((ASTNode) tu);
if (lastDecl != null) {
nodeCommenter.appendRemainingComments(lastDecl);
}
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTName name) {
nodeCommenter.appendComments((ASTNode) name);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTDeclaration declaration) {
lastDecl = declaration;
nodeCommenter.appendComments((ASTNode) declaration);
return PROCESS_CONTINUE;
}
@Override
public int leave(ICPPASTNamespaceDefinition namespaceDefinition) {
return nodeCommenter.appendFreestandingComments((ASTNode) namespaceDefinition);
}
@Override
public int leave(IASTInitializer initializer) {
nodeCommenter.appendComments((ASTNode) initializer);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTParameterDeclaration parameterDeclaration) {
nodeCommenter.appendComments((ASTNode) parameterDeclaration);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTDeclarator declarator) {
nodeCommenter.appendComments((ASTNode) declarator);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTDeclSpecifier declSpec) {
if(declSpec instanceof CPPASTCompositeTypeSpecifier) {
return nodeCommenter.appendFreestandingComments((ASTNode) declSpec);
}
nodeCommenter.appendComments((ASTNode) declSpec);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTExpression expression) {
nodeCommenter.appendComments((ASTNode) expression);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTStatement statement) {
if(statement instanceof IASTCompoundStatement) {
return nodeCommenter.appendFreestandingComments((ASTNode) statement);
}
nodeCommenter.appendComments((ASTNode) statement);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTTypeId typeId) {
nodeCommenter.appendComments((ASTNode) typeId);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTEnumerator enumerator) {
nodeCommenter.appendComments((ASTNode) enumerator);
return PROCESS_CONTINUE;
}
@Override
public int leave(IASTProblem problem) {
nodeCommenter.appendComments((ASTNode) problem);
return PROCESS_CONTINUE;
}
}