| /********************************************************************** |
| * Copyright (c) 2010 IBM Corporation. |
| * 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.ptp.pldt.openmp.fortran.analysis; |
| |
| import org.eclipse.photran.internal.core.lexer.Token; |
| import org.eclipse.photran.internal.core.parser.ASTNameNode; |
| import org.eclipse.photran.internal.core.parser.ASTVarOrFnRefNode; |
| import org.eclipse.photran.internal.core.parser.GenericASTVisitor; |
| import org.eclipse.ptp.pldt.common.Artifact; |
| import org.eclipse.ptp.pldt.common.ScanReturn; |
| import org.eclipse.ptp.pldt.common.util.SourceInfo; |
| |
| /** |
| * This visitor collects OpenMP related constructs (currently function calls and constants), and |
| * add markers to the source file for Fortran code. |
| * |
| * @author Jeff Overbey |
| * @author Beth Tibbitts |
| */ |
| public class OpenMPFortranASTVisitor extends GenericASTVisitor { |
| private static final String PREFIX = "OMP_"; //$NON-NLS-1$ |
| |
| private ScanReturn scanReturn; |
| private String fileName; |
| |
| public OpenMPFortranASTVisitor(String fileName, ScanReturn scanReturn) { |
| this.scanReturn = scanReturn; |
| this.fileName = fileName; |
| } |
| |
| @Override |
| public void visitToken(Token node) { |
| /* |
| * In Fortran, OpenMP directives are comments (e.g., !$omp parallel). |
| * Photran attaches comments to the following token. Since they appear |
| * before several types of statements (including END statements), it's |
| * easiest to just iterate through all the tokens in the AST and collect |
| * the preceding OpenMP directives. |
| */ |
| for (Token ompDirective : node.getOpenMPComments()) { |
| addArtifact(ompDirective, Artifact.PRAGMA); |
| } |
| } |
| |
| @Override |
| public void visitASTVarOrFnRefNode(ASTVarOrFnRefNode node) { |
| ASTNameNode nameNode = node.getName(); |
| if (nameNode != null) { // function call |
| addArtifact(nameNode.getName(), Artifact.FUNCTION_CALL); |
| } |
| } |
| |
| private void addArtifact(Token token, int artifactType) { |
| String callname = token.getText().toUpperCase(); |
| if (artifactType == Artifact.PRAGMA || callname.startsWith(PREFIX)) { |
| int start = token.getFileOffset(); |
| int end = token.getFileOffset() + token.getLength(); |
| SourceInfo si = new SourceInfo(token.getLine(), start, end, artifactType); |
| scanReturn.addArtifact(new Artifact(fileName, token.getLine(), 1, callname, si)); |
| } |
| } |
| } |