Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 212258 Details for
Bug 373597
PLDT artifact analyses no longer work for Fortran
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Proposed patch
pldt-extensionpoints.patch (text/plain), 95.99 KB, created by
Jeffrey Overbey
on 2012-03-07 17:03:03 EST
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Jeffrey Overbey
Created:
2012-03-07 17:03:03 EST
Size:
95.99 KB
patch
obsolete
>diff --git tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/ArtifactAnalysisBase.java tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/ArtifactAnalysisBase.java >new file mode 100644 >index 0000000..888b9d4 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/ArtifactAnalysisBase.java >@@ -0,0 +1,49 @@ >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >+ * Jeff Overbey (UIUC) - modified to use extension point >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.common; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >+import org.eclipse.cdt.core.index.IIndex; >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.core.runtime.IStatus; >+ >+/** >+ * Base class for implementations of {@link IArtifactAnalysis} that handle C and >+ * C++. >+ * <p> >+ * This class contains the {@link #getAST(ITranslationUnit)} utility method, >+ * which returns an {@link IASTTranslationUnit} for an {@link ITranslationUnit}. >+ * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey >+ * >+ * @since 6.0 >+ */ >+public abstract class ArtifactAnalysisBase implements IArtifactAnalysis { >+ /** >+ * Get AST from index, not full tu >+ * >+ * @param tu >+ * translation unit from which to get the AST >+ * @return {@link IASTTranslationUnit} or <code>null</code> >+ */ >+ protected IASTTranslationUnit getAST(ITranslationUnit tu) { >+ try { >+ IIndex index = CCorePlugin.getIndexManager().getIndex(tu.getCProject()); >+ return tu.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS); >+ } catch (Exception e) { >+ CommonPlugin.log(IStatus.ERROR, "RunAnalyseHandlerBase.getAST(): Error getting AST (from index) for project " + tu.getCProject() + " " + e.getMessage()); //$NON-NLS-1$ >+ return null; >+ } >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/IArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/IArtifactAnalysis.java >new file mode 100644 >index 0000000..b2694e7 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/IArtifactAnalysis.java >@@ -0,0 +1,25 @@ >+package org.eclipse.ptp.pldt.common; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.model.ITranslationUnit; >+ >+/** >+ * An artifact analysis for MPI, OpenMP, or OpenACC. >+ * <p> >+ * This interface is implemented by contributions to the following extension points: >+ * <ul> >+ * <li> org.eclipse.ptp.pldt.mpi.core.artifactAnalysis >+ * <li> org.eclipse.ptp.pldt.openmp.core.artifactAnalysis >+ * <li> org.eclipse.ptp.pldt.openacc.artifactAnalysis >+ * </ul> >+ * <p> >+ * Implementations targeting C and C++ will typically subclass {@link ArtifactAnalysisBase}. >+ * >+ * @since 6.0 >+ * >+ * @see ArtifactAnalysisBase >+ */ >+public interface IArtifactAnalysis { >+ ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch); >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/actions/RunAnalyseHandlerBase.java tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/actions/RunAnalyseHandlerBase.java >index aa6e7c0..d0ee672 100644 >--- tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/actions/RunAnalyseHandlerBase.java >+++ tools/pldt/org.eclipse.ptp.pldt.common/src/org/eclipse/ptp/pldt/common/actions/RunAnalyseHandlerBase.java >@@ -1,5 +1,5 @@ > /********************************************************************** >- * Copyright (c) 2005, 2011 IBM Corporation. >+ * Copyright (c) 2005, 2011, 2012 IBM Corporation, University of Illinois, 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 >@@ -7,17 +7,14 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Jeff Overbey (UIUC) - modified to use extension point > *******************************************************************************/ >- > package org.eclipse.ptp.pldt.common.actions; > > import java.lang.reflect.InvocationTargetException; > import java.util.Iterator; > import java.util.List; > >-import org.eclipse.cdt.core.CCorePlugin; >-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >-import org.eclipse.cdt.core.index.IIndex; > import org.eclipse.cdt.core.model.ICContainer; > import org.eclipse.cdt.core.model.ICElement; > import org.eclipse.cdt.core.model.ICProject; >@@ -31,8 +28,10 @@ import org.eclipse.core.resources.IProjectNature; > import org.eclipse.core.resources.IResource; > import org.eclipse.core.runtime.CoreException; > import org.eclipse.core.runtime.IAdaptable; >+import org.eclipse.core.runtime.IConfigurationElement; > import org.eclipse.core.runtime.IProgressMonitor; > import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.Platform; > import org.eclipse.core.runtime.Preferences; > import org.eclipse.jface.action.IAction; > import org.eclipse.jface.dialogs.MessageDialog; >@@ -43,6 +42,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; > import org.eclipse.ptp.pldt.common.Artifact; > import org.eclipse.ptp.pldt.common.ArtifactMarkingVisitor; > import org.eclipse.ptp.pldt.common.CommonPlugin; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; > import org.eclipse.ptp.pldt.common.ScanReturn; > import org.eclipse.ptp.pldt.common.messages.Messages; > import org.eclipse.ptp.pldt.common.util.AnalysisUtil; >@@ -62,6 +62,7 @@ import org.eclipse.ui.actions.WorkspaceModifyOperation; > * The analysis is done in the doArtifactAnalysis() method > * > * @author Beth Tibbitts >+ * @author Jeff Overbey > * > * IObjectActionDelegate enables popup menu selection <br> > * IWindowActionDelegate enables toolbar(or menu) selection >@@ -220,6 +221,41 @@ public abstract class RunAnalyseHandlerBase extends RunAnalyseHandler { > public abstract ScanReturn doArtifactAnalysis(final ITranslationUnit tu, final List<String> includes); > > /** >+ * Runs an artifact analysis for the given file by searching the given extension point for an {@link IArtifactAnalysis} that matches its language ID. >+ * <p> >+ * This is a utility method generally invoked from {@link #doArtifactAnalysis(ITranslationUnit, List)}. >+ * <p> >+ * It is assumed that only one extension will be contributed per language ID. If multiple extensions are found, it is unspecified which one will be run. >+ * >+ * @param extensionPointID >+ * @param tu >+ * @param includes >+ * @param allowPrefixOnlyMatch >+ * @return {@link ScanReturn} >+ * >+ * @since 6.0 >+ */ >+ protected ScanReturn runArtifactAnalysisFromExtensionPoint(String extensionPointID, final ITranslationUnit tu, final List<String> includes, final boolean allowPrefixOnlyMatch) { >+ try { >+ final String languageID = tu.getLanguage().getId(); >+ for (IConfigurationElement config : Platform.getExtensionRegistry().getConfigurationElementsFor(extensionPointID)) { >+ try { >+ if (languageID.equals(config.getAttribute("languageID"))) { >+ IArtifactAnalysis artifactAnalysis = (IArtifactAnalysis) config.createExecutableExtension("class"); //$NON-NLS-1$ >+ return artifactAnalysis.runArtifactAnalysis(languageID, tu, includes, allowPrefixOnlyMatch); >+ } >+ } catch (CoreException e) { >+ CommonPlugin.log(e.getClass().getSimpleName() + ": " + e.getMessage()); >+ } >+ } >+ } catch (CoreException e) { >+ e.printStackTrace(); >+ CommonPlugin.log(IStatus.ERROR, "RunAnalyseMPICommandHandler: Error setting up analysis for project " + tu.getCProject() + " error=" + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ >+ } >+ return new ScanReturn(); >+ } >+ >+ /** > * Implemented for Handler; this replaces run() which is for actions. > */ > public Object execute(ExecutionEvent event) throws ExecutionException { >@@ -515,32 +551,6 @@ public abstract class RunAnalyseHandlerBase extends RunAnalyseHandler { > } > > /** >- * Get AST from index, not full tu >- * >- * @param tu >- * translation unit from which to get the AST >- * @return >- */ >- protected IASTTranslationUnit getAST(ITranslationUnit tu) { >- IIndex index; >- try { >- index = CCorePlugin.getIndexManager().getIndex(tu.getCProject()); >- IASTTranslationUnit ast = tu.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS); >- // IASTTranslationUnit ast = tu.getAST(index, 0); >- if (traceOn) { >- System.out.println(" getAST(index,AST_SKIP_ALL_HEADERS)"); //$NON-NLS-1$ >- } >- >- return ast; >- } catch (Exception e) { >- String msg = "RunAnalyseHandlerBase.getAST(): Error getting AST (from index) for project " + tu.getCProject() + " " + e.getMessage();//$NON-NLS-1$ >- CommonPlugin.log(IStatus.ERROR, msg); >- return null; >- } >- >- } >- >- /** > * Get the include path. Subclass should override this method. > * > * @return >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.core/build.properties tools/pldt/org.eclipse.ptp.pldt.mpi.core/build.properties >index 0122072..f8cfd95 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.core/build.properties >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.core/build.properties >@@ -7,7 +7,8 @@ bin.includes = plugin.xml,\ > .,\ > templates/,\ > plugin.properties,\ >- about.html >+ about.html,\ >+ schema/ > src.includes = html/,\ > icons/,\ > mpiref.xml,\ >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.core/plugin.xml tools/pldt/org.eclipse.ptp.pldt.mpi.core/plugin.xml >index e6134a7..9f95ce8 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.core/plugin.xml >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.core/plugin.xml >@@ -119,10 +119,25 @@ > > </menuContribution> > </extension> >- <!-- Code templates --> >+ >+ <!-- Code templates --> > <extension point="org.eclipse.ui.editors.templates"> >- <include file="templates/mpi_templates.xml" /> >+ <include file="templates/mpi_templates.xml" /> >+ </extension> > >+ <!-- Artifact analysis extension point --> >+ <extension-point >+ id="artifactAnalysis" >+ name="MPI Artifact Analysis" >+ schema="schema/artifactAnalysis.exsd"/> >+ <!-- Artifact analyses for C and C++ --> >+ <extension point="org.eclipse.ptp.pldt.mpi.core.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.gcc" >+ class="org.eclipse.ptp.pldt.mpi.core.analysis.CMPIArtifactAnalysis" /> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.g++" >+ class="org.eclipse.ptp.pldt.mpi.core.analysis.CMPIArtifactAnalysis" /> > </extension> > > </plugin> >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.core/schema/artifactAnalysis.exsd tools/pldt/org.eclipse.ptp.pldt.mpi.core/schema/artifactAnalysis.exsd >new file mode 100644 >index 0000000..749c1af >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.core/schema/artifactAnalysis.exsd >@@ -0,0 +1,88 @@ >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.ptp.pldt.mpi.core" xmlns="http://www.w3.org/2001/XMLSchema"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.ptp.pldt.mpi.core" id="artifactAnalysis" name="MPI Artifact Analysis"/> >+ </appInfo> >+ <documentation> >+ Allows plug-ins to contribute MPI artifact analyses. >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <annotation> >+ <appInfo> >+ <meta.element /> >+ </appInfo> >+ </annotation> >+ <complexType> >+ <sequence minOccurs="1" maxOccurs="unbounded"> >+ <element ref="artifactAnalysis"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="artifactAnalysis"> >+ <complexType> >+ <attribute name="languageID" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="identifier" basedOn="org.eclipse.cdt.core.language/language/@id"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="class" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn=":org.eclipse.ptp.pldt.common.IArtifactAnalysis"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 6.0 >+ </documentation> >+ </annotation> >+ >+ >+ >+ >+ >+</schema> >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/actions/RunAnalyseMPIcommandHandler.java tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/actions/RunAnalyseMPIcommandHandler.java >index 0ba3102..a6aadf7 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/actions/RunAnalyseMPIcommandHandler.java >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/actions/RunAnalyseMPIcommandHandler.java >@@ -1,5 +1,5 @@ >-/********************************************************************** >- * Copyright (c) 2007,2011 IBM Corporation. >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >@@ -7,36 +7,31 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Jeff Overbey (UIUC) - modified to use extension point > *******************************************************************************/ >- > package org.eclipse.ptp.pldt.mpi.core.actions; > >-import java.lang.reflect.Method; > import java.util.List; > >-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >-import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; >-import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; >-import org.eclipse.cdt.core.model.ILanguage; > import org.eclipse.cdt.core.model.ITranslationUnit; >-import org.eclipse.core.runtime.CoreException; >-import org.eclipse.core.runtime.IStatus; >-import org.eclipse.ptp.pldt.common.CommonPlugin; > import org.eclipse.ptp.pldt.common.ScanReturn; > import org.eclipse.ptp.pldt.common.actions.RunAnalyseHandlerBase; > import org.eclipse.ptp.pldt.common.util.ViewActivator; > import org.eclipse.ptp.pldt.mpi.core.MPIArtifactMarkingVisitor; > import org.eclipse.ptp.pldt.mpi.core.MpiPlugin; >-import org.eclipse.ptp.pldt.mpi.core.analysis.MpiCASTVisitor; >-import org.eclipse.ptp.pldt.mpi.core.analysis.MpiCPPASTVisitor; > import org.eclipse.ptp.pldt.mpi.internal.core.MpiIDs; > > /** >- * @author tibbitts >- * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey > */ > public class RunAnalyseMPIcommandHandler extends RunAnalyseHandlerBase { > /** >+ * ID for the extension point which allows plug-ins to contribute MPI artifact analyses based on language IDs. >+ */ >+ private static final String EXTENSION_POINT_ID = "org.eclipse.ptp.pldt.mpi.core.artifactAnalysis"; >+ >+ /** > * Constructor for the "Run Analysis" action > */ > public RunAnalyseMPIcommandHandler() { >@@ -53,50 +48,8 @@ public class RunAnalyseMPIcommandHandler extends RunAnalyseHandlerBase { > */ > @Override > public ScanReturn doArtifactAnalysis(final ITranslationUnit tu, final List<String> includes) { >- final ScanReturn msr = new ScanReturn(); >- final String fileName = tu.getElementName(); >- ILanguage lang; >- boolean allowPrefixOnlyMatch = MpiPlugin.getDefault().getPreferenceStore() >- .getBoolean(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE); >- try { >- lang = tu.getLanguage(); >- >- // long startTime = System.currentTimeMillis(); >- IASTTranslationUnit atu = getAST(tu); // use index; was tu.getAST(); >- >- // long endTime = System.currentTimeMillis(); >- // System.out.println("RunAnalyseMPICommandHandler: time to build AST for "+tu+": "+(endTime-startTime)/1000.0+" sec"); >- String languageID = lang.getId(); >- if (languageID.equals(GCCLanguage.ID) || languageID.equals(GPPLanguage.ID)) { >- // null IASTTranslationUnit when we're doing C/C++ means we should quit. >- // but want to continue to see if this is a fortran file we are analyzing. >- if (atu == null) {// this is null for Fortran file during JUnit testing. >- System.out.println("RunAnalyseMPICommandHandler.doArtifactAnalysis(), atu is null (Fortran testing?)"); //$NON-NLS-1$ >- return msr; >- } >- } >- if (languageID.equals(GCCLanguage.ID)) {// C >- atu.accept(new MpiCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >- } else if (languageID.equals(GPPLanguage.ID)) { // C++ >- atu.accept(new MpiCPPASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >- } else { >- // Attempt to handle Fortran >- // Instantiate using reflection to avoid static Photran dependencies >- try { >- Class<?> c = Class.forName("org.eclipse.ptp.pldt.mpi.fortran.actions.AnalyseMPIFortranHandler"); //$NON-NLS-1$ >- Method method = c.getMethod("run", String.class, ITranslationUnit.class, String.class, ScanReturn.class); //$NON-NLS-1$ >- method.invoke(c.newInstance(), languageID, tu, fileName, msr); >- } catch (Exception e) { >- System.err.println("RunAnalyseMPIcommandHandler.doArtifactAnalysis: Photran not installed"); //$NON-NLS-1$ >- } >- } >- } catch (CoreException e) { >- e.printStackTrace(); >- CommonPlugin >- .log(IStatus.ERROR, >- "RunAnalyseMPICommandHandler.getAST():Error setting up visitor for project " + tu.getCProject() + " error=" + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ >- } >- return msr; >+ final boolean allowPrefixOnlyMatch = MpiPlugin.getDefault().getPreferenceStore().getBoolean(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE); >+ return runArtifactAnalysisFromExtensionPoint(EXTENSION_POINT_ID, tu, includes, allowPrefixOnlyMatch); > } > > @Override >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/analysis/CMPIArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/analysis/CMPIArtifactAnalysis.java >new file mode 100644 >index 0000000..768014e >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.core/src/org/eclipse/ptp/pldt/mpi/core/analysis/CMPIArtifactAnalysis.java >@@ -0,0 +1,48 @@ >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >+ * Jeff Overbey (UIUC) - modified to use extension point >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.mpi.core.analysis; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >+import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; >+import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.ptp.pldt.common.ArtifactAnalysisBase; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+ >+/** >+ * MPI artifact analysis for C and C++. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.mpi.core.artifactAnalysis</code> extension point. >+ * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey >+ */ >+public class CMPIArtifactAnalysis extends ArtifactAnalysisBase implements IArtifactAnalysis { >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final ScanReturn msr = new ScanReturn(); >+ final String fileName = tu.getElementName(); >+ final IASTTranslationUnit atu = getAST(tu); // use index; was tu.getAST(); >+ if (atu != null) { >+ if (languageID.equals(GCCLanguage.ID)) { // C >+ atu.accept(new MpiCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >+ } else if (languageID.equals(GPPLanguage.ID)) { // C++ >+ atu.accept(new MpiCPPASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >+ } else { >+ throw new IllegalStateException("Unexpected language ID " + languageID); >+ } >+ } >+ return msr; >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/META-INF/MANIFEST.MF tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/META-INF/MANIFEST.MF >index 3aa32e3..9a9d359 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/META-INF/MANIFEST.MF >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/META-INF/MANIFEST.MF >@@ -7,13 +7,17 @@ Bundle-ClassPath: . > Bundle-Activator: org.eclipse.ptp.pldt.mpi.fortran.Activator > Bundle-Vendor: %pluginProvider > Bundle-Localization: plugin >-Require-Bundle: org.eclipse.ui, >- org.eclipse.core.runtime, >+Require-Bundle: org.eclipse.core.runtime, > org.eclipse.core.resources, >+ org.eclipse.help, >+ org.eclipse.ui, >+ org.eclipse.ui.editors, > org.eclipse.cdt.core, > org.eclipse.cdt.ui, >- org.eclipse.ptp.pldt.common, > org.eclipse.photran.cdtinterface;bundle-version="7.0.0", >- org.eclipse.photran.core.vpg;bundle-version="7.0.0" >+ org.eclipse.photran.core.vpg;bundle-version="7.0.0", >+ org.eclipse.photran.ui;bundle-version="8.0.0", >+ org.eclipse.ptp.pldt.common, >+ org.eclipse.ptp.pldt.mpi.core > Bundle-ActivationPolicy: lazy > Bundle-RequiredExecutionEnvironment: J2SE-1.5 >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/build.properties tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/build.properties >index 41c9fe3..ee9ccb9 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/build.properties >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/build.properties >@@ -1,7 +1,8 @@ > bin.includes = META-INF/,\ > .,\ > plugin.properties,\ >- about.html >+ about.html,\ >+ plugin.xml > jars.compile.order = . > source.. = src/ > output.. = bin/ >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/plugin.xml tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/plugin.xml >new file mode 100644 >index 0000000..2022dbd >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/plugin.xml >@@ -0,0 +1,20 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<?eclipse version="3.4"?> >+<plugin> >+ >+ <!-- MPI artifact analysis for Fortran --> >+ <extension point="org.eclipse.ptp.pldt.mpi.core.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.photran.cdtinterface.fortran" >+ class="org.eclipse.ptp.pldt.mpi.fortran.analysis.MPIFortranArtifactAnalysis" /> >+ </extension> >+ >+ <!-- Dynamic help for MPI in the Photran editor --> >+ <extension >+ point="org.eclipse.photran.ui.apiHelpProvider"> >+ <apiHelpProvider >+ class="org.eclipse.ptp.pldt.mpi.fortran.editorHelp.MpiFortranHelpProvider"> >+ </apiHelpProvider> >+ </extension> >+ >+</plugin> >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/Activator.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/Activator.java >index 14ac9cc..276035a 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/Activator.java >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/Activator.java >@@ -13,6 +13,8 @@ package org.eclipse.ptp.pldt.mpi.fortran; > > import org.eclipse.core.resources.IWorkspace; > import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.Status; > import org.eclipse.swt.widgets.Display; > import org.eclipse.ui.plugin.AbstractUIPlugin; > import org.osgi.framework.BundleContext; >@@ -28,6 +30,38 @@ public class Activator extends AbstractUIPlugin { > private static final String PLUGIN_ID = "org.eclipse.ptp.pldt.mpi.fortran"; //$NON-NLS-1$ > > /** >+ * Returns the shared instance. >+ */ >+ public static Activator getDefault() { >+ return plugin; >+ } >+ >+ /** >+ * Returns the workspace instance. >+ */ >+ public static IWorkspace getWorkspace() { >+ return ResourcesPlugin.getWorkspace(); >+ } >+ >+ /** >+ * Returns the standard display to be used. The method first checks, if the >+ * thread calling this method has an associated display. If so, this display >+ * is returned. Otherwise the method returns the default display. >+ */ >+ public static Display getStandardDisplay() { >+ Display display; >+ display = Display.getCurrent(); >+ if (display == null) { >+ display = Display.getDefault(); >+ } >+ return display; >+ } >+ >+ public static String getPluginId() { >+ return PLUGIN_ID; >+ } >+ >+ /** > * The constructor. > */ > public Activator() { >@@ -53,34 +87,29 @@ public class Activator extends AbstractUIPlugin { > } > > /** >- * Returns the shared instance. >+ * Create log entry from an IStatus >+ * >+ * @param status > */ >- public static Activator getDefault() { >- return plugin; >+ public static void log(IStatus status) { >+ getDefault().getLog().log(status); > } > > /** >- * Returns the workspace instance. >+ * Create log entry from a string >+ * >+ * @param msg > */ >- public static IWorkspace getWorkspace() { >- return ResourcesPlugin.getWorkspace(); >+ public static void log(String msg) { >+ log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, msg, null)); > } > > /** >- * Returns the standard display to be used. The method first checks, if the >- * thread calling this method has an associated display. If so, this display >- * is returned. Otherwise the method returns the default display. >+ * Create log entry from a Throwable >+ * >+ * @param e > */ >- public static Display getStandardDisplay() { >- Display display; >- display = Display.getCurrent(); >- if (display == null) { >- display = Display.getDefault(); >- } >- return display; >- } >- >- public static String getPluginId() { >- return PLUGIN_ID; >+ public static void log(Throwable e) { >+ log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, e.getMessage(), e)); > } > } >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/actions/AnalyseMPIFortranHandler.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/actions/AnalyseMPIFortranHandler.java >index 08d02d8..abcedfa 100644 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/actions/AnalyseMPIFortranHandler.java >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/actions/AnalyseMPIFortranHandler.java >@@ -19,7 +19,7 @@ import org.eclipse.photran.internal.core.lexer.ASTLexerFactory; > import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode; > import org.eclipse.photran.internal.core.parser.Parser; > import org.eclipse.ptp.pldt.common.ScanReturn; >-import org.eclipse.ptp.pldt.mpi.fortran.analysis.MpiFortranASTVisitor; >+import org.eclipse.ptp.pldt.mpi.fortran.analysis.MPIFortranASTVisitor; > > /** > * @since 4.0 >@@ -34,7 +34,7 @@ public class AnalyseMPIFortranHandler { > > try { > ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(file)); >- ast.accept(new MpiFortranASTVisitor(fileName, msr)); >+ ast.accept(new MPIFortranASTVisitor(fileName, msr)); > } catch (Exception e) { > e.printStackTrace(); // TODO > } >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranASTVisitor.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranASTVisitor.java >new file mode 100644 >index 0000000..404b709 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranASTVisitor.java >@@ -0,0 +1,71 @@ >+/********************************************************************** >+ * Copyright (c) 2005, 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.mpi.fortran.analysis; >+ >+import org.eclipse.photran.internal.core.lexer.Token; >+import org.eclipse.photran.internal.core.parser.ASTCallStmtNode; >+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 dom-walker collects "artifacts" related to the specific domain <br> >+ * (e.g. MPI, OpenMP, etc.). Currently these artifacts include function calls >+ * and constants. It adds markers to the source file for C code, marking the >+ * position of the artifacts found. >+ * >+ * @author Beth Tibbitts >+ * @since 4.0 >+ * >+ */ >+public class MPIFortranASTVisitor extends GenericASTVisitor { >+ private static final String PREFIX = "MPI_"; //$NON-NLS-1$ >+ >+ @SuppressWarnings("unused") >+ private static final boolean traceOn = false; >+ private final ScanReturn scanReturn; >+ private final String fileName; >+ >+ @Override >+ public void visitASTCallStmtNode(ASTCallStmtNode node) { >+ Token subroutineName = node.getSubroutineName(); >+ addArtifact(subroutineName, Artifact.FUNCTION_CALL); >+ } >+ >+ @Override >+ public void visitASTVarOrFnRefNode(ASTVarOrFnRefNode node) { >+ ASTNameNode nameNode = node.getName(); >+ if (nameNode != null) { >+ Token varName = nameNode.getName(); >+ addArtifact(varName, Artifact.CONSTANT); >+ } >+ } >+ >+ private void addArtifact(Token subroutineName, int artifactType) { >+ String callname = subroutineName.getText().toUpperCase(); >+ if (callname.startsWith(PREFIX)) { >+ int start = subroutineName.getFileOffset(); >+ int end = subroutineName.getFileOffset() + subroutineName.getLength(); >+ SourceInfo si = new SourceInfo(subroutineName.getLine(), start, end, artifactType); >+ scanReturn.addArtifact(new Artifact(fileName, subroutineName.getLine(), 1, callname, si)); >+ } >+ } >+ >+ public MPIFortranASTVisitor(String fileName, ScanReturn scanReturn) { >+ super(); >+ this.scanReturn = scanReturn; >+ this.fileName = fileName; >+ } >+ >+} >\ No newline at end of file >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranArtifactAnalysis.java >new file mode 100644 >index 0000000..24d9552 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MPIFortranArtifactAnalysis.java >@@ -0,0 +1,33 @@ >+/******************************************************************************* >+ * Copyright (c) 2012 University of Illinois at Urbana-Champaign 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: >+ * UIUC - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.mpi.fortran.analysis; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+import org.eclipse.ptp.pldt.mpi.fortran.actions.AnalyseMPIFortranHandler; >+ >+/** >+ * MPI artifact analysis for Fortran. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.mpi.core.artifactAnalysis</code> extension point. >+ * >+ * @author Jeff Overbey >+ */ >+public class MPIFortranArtifactAnalysis implements IArtifactAnalysis { >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final ScanReturn msr = new ScanReturn(); >+ new AnalyseMPIFortranHandler().run(languageID, tu, tu.getElementName(), msr); >+ return msr; >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MpiFortranASTVisitor.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MpiFortranASTVisitor.java >deleted file mode 100644 >index 1437a64..0000000 >--- tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/analysis/MpiFortranASTVisitor.java >+++ /dev/null >@@ -1,71 +0,0 @@ >-/********************************************************************** >- * Copyright (c) 2005, 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.mpi.fortran.analysis; >- >-import org.eclipse.photran.internal.core.lexer.Token; >-import org.eclipse.photran.internal.core.parser.ASTCallStmtNode; >-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 dom-walker collects "artifacts" related to the specific domain <br> >- * (e.g. MPI, OpenMP, etc.). Currently these artifacts include function calls >- * and constants. It adds markers to the source file for C code, marking the >- * position of the artifacts found. >- * >- * @author Beth Tibbitts >- * @since 4.0 >- * >- */ >-public class MpiFortranASTVisitor extends GenericASTVisitor { >- private static final String PREFIX = "MPI_"; //$NON-NLS-1$ >- >- @SuppressWarnings("unused") >- private static final boolean traceOn = false; >- private final ScanReturn scanReturn; >- private final String fileName; >- >- @Override >- public void visitASTCallStmtNode(ASTCallStmtNode node) { >- Token subroutineName = node.getSubroutineName(); >- addArtifact(subroutineName, Artifact.FUNCTION_CALL); >- } >- >- @Override >- public void visitASTVarOrFnRefNode(ASTVarOrFnRefNode node) { >- ASTNameNode nameNode = node.getName(); >- if (nameNode != null) { >- Token varName = nameNode.getName(); >- addArtifact(varName, Artifact.CONSTANT); >- } >- } >- >- private void addArtifact(Token subroutineName, int artifactType) { >- String callname = subroutineName.getText().toUpperCase(); >- if (callname.startsWith(PREFIX)) { >- int start = subroutineName.getFileOffset(); >- int end = subroutineName.getFileOffset() + subroutineName.getLength(); >- SourceInfo si = new SourceInfo(subroutineName.getLine(), start, end, artifactType); >- scanReturn.addArtifact(new Artifact(fileName, subroutineName.getLine(), 1, callname, si)); >- } >- } >- >- public MpiFortranASTVisitor(String fileName, ScanReturn scanReturn) { >- super(); >- this.scanReturn = scanReturn; >- this.fileName = fileName; >- } >- >-} >\ No newline at end of file >diff --git tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/editorHelp/MpiFortranHelpProvider.java tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/editorHelp/MpiFortranHelpProvider.java >new file mode 100644 >index 0000000..f3105a0 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.mpi.fortran/src/org/eclipse/ptp/pldt/mpi/fortran/editorHelp/MpiFortranHelpProvider.java >@@ -0,0 +1,108 @@ >+/********************************************************************** >+ * Copyright (c) 2005, 2011 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.mpi.fortran.editorHelp; >+ >+import java.io.IOException; >+import java.io.InputStream; >+import java.net.URL; >+import java.util.Collections; >+import java.util.HashMap; >+import java.util.Map; >+ >+import javax.xml.parsers.DocumentBuilder; >+import javax.xml.parsers.DocumentBuilderFactory; >+ >+import org.eclipse.core.runtime.FileLocator; >+import org.eclipse.core.runtime.Path; >+import org.eclipse.core.runtime.Platform; >+import org.eclipse.help.IHelpResource; >+import org.eclipse.photran.ui.IFortranAPIHelpProvider; >+import org.eclipse.ptp.pldt.mpi.core.MpiPlugin; >+import org.eclipse.ptp.pldt.mpi.fortran.Activator; >+import org.eclipse.ui.texteditor.ITextEditor; >+import org.w3c.dom.Document; >+import org.w3c.dom.Node; >+import org.w3c.dom.NodeList; >+ >+/** >+ * Help book for Fortran MPI functions >+ * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey >+ */ >+public class MpiFortranHelpProvider implements IFortranAPIHelpProvider { >+ private final Map<String, String> fNameToCname; >+ >+ /** >+ * builds the list of function summaries by parsing an XML file >+ */ >+ public MpiFortranHelpProvider() { >+ Map<String, String> fNameToCname; >+ URL fileURL = FileLocator.find(Platform.getBundle(MpiPlugin.getPluginId()), new Path("mpiref.xml"), null); //$NON-NLS-1$ >+ try { >+ fNameToCname = parseDOM(fileURL.openStream()); >+ } catch (IOException e) { >+ Activator.log(e); >+ fNameToCname = Collections.<String, String>emptyMap(); >+ } >+ this.fNameToCname = fNameToCname; >+ } >+ >+ public static Map<String, String> parseDOM(InputStream xmlIn) { >+ final Map<String, String> fNameToCname = new HashMap<String, String>(); >+ if (xmlIn != null) >+ { >+ try { >+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); >+ Document document = builder.parse(xmlIn); >+ NodeList functionList = document.getElementsByTagName("function");//$NON-NLS-1$ >+ for (int i = 0; i < functionList.getLength(); i++) { >+ Node func = functionList.item(i); >+ NodeList child = func.getChildNodes(); >+ String fname = null; >+ String cname = null; >+ // String desc = null; >+ for (int j = 0; j < child.getLength(); j++) { >+ Node sub = child.item(j); >+ if (sub.getNodeName().equals("cname")) { >+ cname = sub.getTextContent(); // java 5 >+ //} else if (sub.getNodeName().equals("description")) {//$NON-NLS-1$ >+ // desc = sub.getTextContent(); // java 5 >+ } else if (sub.getNodeName().equals("fname")) {//$NON-NLS-1$ >+ fname = sub.getTextContent(); // java 5 >+ } >+ } >+ if (fname != null && cname != null) { >+ fNameToCname.put(fname.toUpperCase(), cname); >+ } >+ } >+ } catch (Exception e) { >+ Activator.log(e); >+ } >+ } >+ return fNameToCname; >+ } >+ >+ public IHelpResource[] getHelpResources(ITextEditor fortranEditor, String name, String precedingText) { >+ final String fname = name.toUpperCase(); >+ if (fNameToCname.containsKey(fname)) { >+ return new IHelpResource[] { new IHelpResource() { >+ public String getHref() { >+ return String.format("/%s/html/%s.html", MpiPlugin.getPluginId(), fNameToCname.get(fname)); >+ } >+ public String getLabel() { >+ return fname; >+ } >+ } }; >+ } >+ return null; >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/META-INF/MANIFEST.MF tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/META-INF/MANIFEST.MF >index 8aded0a..573e8d8 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/META-INF/MANIFEST.MF >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/META-INF/MANIFEST.MF >@@ -15,6 +15,9 @@ Require-Bundle: org.eclipse.core.runtime, > org.eclipse.cdt.ui, > org.eclipse.ptp.pldt.common, > org.eclipse.ptp.pldt.openacc, >+ org.eclipse.photran.core, >+ org.eclipse.photran.core.vpg, >+ org.eclipse.photran.cdtinterface, > org.eclipse.photran.ui;bundle-version="8.0.0" > Bundle-ActivationPolicy: lazy > Bundle-ClassPath: . >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/plugin.xml tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/plugin.xml >index 6fdd17f..49808c3 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/plugin.xml >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/plugin.xml >@@ -2,6 +2,13 @@ > <?eclipse version="3.0"?> > <plugin> > >+ <!-- OpenACC artifact analysis for Fortran --> >+ <extension point="org.eclipse.ptp.pldt.openacc.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.photran.cdtinterface.fortran" >+ class="org.eclipse.ptp.pldt.openacc.internal.fortran.actions.OpenACCFortranArtifactAnalysis" /> >+ </extension> >+ > <!-- OpenACC API help for Fortran --> > <extension > point="org.eclipse.photran.ui.apiHelpProvider"> >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranASTVisitor.java tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranASTVisitor.java >new file mode 100644 >index 0000000..0b1ff77 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranASTVisitor.java >@@ -0,0 +1,85 @@ >+/********************************************************************** >+ * Copyright (c) 2005, 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.openacc.internal.fortran.actions; >+ >+import org.eclipse.photran.internal.core.lexer.Token; >+import org.eclipse.photran.internal.core.parser.ASTCallStmtNode; >+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 dom-walker collects "artifacts" related to the specific domain <br> >+ * (e.g. MPI, OpenMP, etc.). Currently these artifacts include function calls >+ * and constants. It adds markers to the source file for C code, marking the >+ * position of the artifacts found. >+ * >+ * @author Beth Tibbitts >+ * @since 4.0 >+ * >+ */ >+public class OpenACCFortranASTVisitor extends GenericASTVisitor { >+ private static final String PREFIX = "ACC_"; //$NON-NLS-1$ >+ >+ @SuppressWarnings("unused") >+ private static final boolean traceOn = false; >+ private final ScanReturn scanReturn; >+ private final String fileName; >+ >+ @Override >+ public void visitToken(Token node) { >+ /* >+ * In Fortran, OpenACC directives are comments (e.g., !$acc 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 accDirective : node.getOpenACCComments()) { >+ addArtifact(accDirective, Artifact.PRAGMA); >+ } >+ } >+ >+ @Override >+ public void visitASTCallStmtNode(ASTCallStmtNode node) { >+ Token subroutineName = node.getSubroutineName(); >+ addArtifact(subroutineName, Artifact.FUNCTION_CALL); >+ } >+ >+ @Override >+ public void visitASTVarOrFnRefNode(ASTVarOrFnRefNode node) { >+ ASTNameNode nameNode = node.getName(); >+ if (nameNode != null) { >+ Token varName = nameNode.getName(); >+ addArtifact(varName, Artifact.CONSTANT); >+ } >+ } >+ >+ private void addArtifact(Token subroutineName, int artifactType) { >+ String callname = subroutineName.getText().toUpperCase(); >+ if (artifactType == Artifact.PRAGMA || callname.startsWith(PREFIX)) { >+ int start = subroutineName.getFileOffset(); >+ int end = subroutineName.getFileOffset() + subroutineName.getLength(); >+ SourceInfo si = new SourceInfo(subroutineName.getLine(), start, end, artifactType); >+ scanReturn.addArtifact(new Artifact(fileName, subroutineName.getLine(), 1, callname, si)); >+ } >+ } >+ >+ public OpenACCFortranASTVisitor(String fileName, ScanReturn scanReturn) { >+ super(); >+ this.scanReturn = scanReturn; >+ this.fileName = fileName; >+ } >+ >+} >\ No newline at end of file >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranArtifactAnalysis.java >new file mode 100644 >index 0000000..00c039d >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/actions/OpenACCFortranArtifactAnalysis.java >@@ -0,0 +1,52 @@ >+/******************************************************************************* >+ * Copyright (c) 2012 University of Illinois at Urbana-Champaign 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: >+ * UIUC - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.openacc.internal.fortran.actions; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.photran.internal.cdtinterface.core.FortranLanguage; >+import org.eclipse.photran.internal.core.lexer.ASTLexerFactory; >+import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode; >+import org.eclipse.photran.internal.core.parser.Parser; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+ >+/** >+ * OpenACC artifact analysis for Fortran. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.mpi.core.artifactAnalysis</code> extension point. >+ * >+ * @author Jeff Overbey >+ */ >+public class OpenACCFortranArtifactAnalysis implements IArtifactAnalysis { >+ @Override >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final ScanReturn msr = new ScanReturn(); >+ final String fileName = tu.getElementName(); >+ if (languageID.equals(FortranLanguage.LANGUAGE_ID)) { >+ IResource res = tu.getUnderlyingResource(); >+ if (!(res instanceof IFile)) >+ throw new IllegalStateException(); >+ IFile file = (IFile) res; >+ >+ try { >+ ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(file)); >+ ast.accept(new OpenACCFortranASTVisitor(fileName, msr)); >+ } catch (Exception e) { >+ e.printStackTrace(); // TODO >+ } >+ } >+ return msr; >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/editorHelp/OpenACCFortranHelpProvider.java tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/editorHelp/OpenACCFortranHelpProvider.java >index 36c6541..1ad798d 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/editorHelp/OpenACCFortranHelpProvider.java >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/src/org/eclipse/ptp/pldt/openacc/internal/fortran/editorHelp/OpenACCFortranHelpProvider.java >@@ -27,16 +27,21 @@ public class OpenACCFortranHelpProvider implements IFortranAPIHelpProvider { > /** Plug-in ID for the main (non-Fortran) OpenACC plug-in, which contains HTML documentation. */ > private static final String OPENACC_PLUGIN_ID = "org.eclipse.ptp.pldt.openacc"; //$NON-NLS-1$ > >- /** Regular expression matching the start of an OpenACC directive */ >- private static final Pattern OPENACC_DIRECTIVE_PREFIX = Pattern >+ /** Pattern matching the start of an OpenACC directive */ >+ private static final Pattern OPENACC_DIRECTIVE_PREFIX_PATTERN = Pattern > .compile("(^[Cc*]|[ \\t]*!)\\$acc([ \\t]+end)?([ \\t]+parallel)?[ \\t]*"); //$NON-NLS-1$ > >+ /** Format string for an OpenACC directive. %s is replaced with a directive name. */ >+ private static final String OPENACC_DIRECTIVE_REGEX_FORMAT = >+ "(^[Cc*]|[ \\t]*!)\\$acc([ \\t]+end)?([ \\t]+parallel)?[ \\t]+%s.*"; //$NON-NLS-1$ >+ > private final Set<String> procedures = new HashSet<String>(32); > private final Set<String> directives = new HashSet<String>(32); > > /** Constructor */ > public OpenACCFortranHelpProvider() { >- procedures.add("acc_get_num_devices"); // OpenACC Application Programming Interface, Version 1.0, Section 3.2.1 //$NON-NLS-1$ >+ // Section numbers from the OpenACC specification: "The OpenACC Application Programming Interface, Version 1.0" >+ procedures.add("acc_get_num_devices"); // Section 3.2.1 //$NON-NLS-1$ > procedures.add("acc_set_device_type"); // 3.2.2 //$NON-NLS-1$ > procedures.add("acc_get_device_type"); // 3.2.3 //$NON-NLS-1$ > procedures.add("acc_set_device_num"); // 3.2.4 //$NON-NLS-1$ >@@ -67,8 +72,16 @@ public class OpenACCFortranHelpProvider implements IFortranAPIHelpProvider { > final String fname = apiName.toLowerCase(); > if (procedures.contains(fname)) { > return getHelpResourceForFilename(fname); >- } else if (directives.contains(fname) && OPENACC_DIRECTIVE_PREFIX.matcher(precedingText).matches()) { >- return getHelpResourceForFilename("pragma_acc_" + fname); //$NON-NLS-1$ >+ } else if (OPENACC_DIRECTIVE_PREFIX_PATTERN.matcher(precedingText).find()) { >+ if (directives.contains(fname)) { >+ return getHelpResourceForFilename("pragma_acc_" + fname); //$NON-NLS-1$ >+ } else { >+ for (String directive : directives) { >+ if (precedingText.matches(String.format(OPENACC_DIRECTIVE_REGEX_FORMAT, directive))) { >+ return getHelpResourceForFilename("pragma_acc_" + directive); //$NON-NLS-1$ >+ } >+ } >+ } > } > return null; > } >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/templates/openacc_templates.xml tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/templates/openacc_templates.xml >index 45f3331..6709201 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/templates/openacc_templates.xml >+++ tools/pldt/org.eclipse.ptp.pldt.openacc.fortran/templates/openacc_templates.xml >@@ -1,7 +1,75 @@ > <?xml version="1.0" encoding="UTF-8" standalone="no"?> > <templates> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.cache" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC cache directive" enabled="true" >+ name="!$acc cache">!$$acc cache (${cursor})</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.data" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC data directive" enabled="true" >+ name="!$acc data">!$$acc data${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.endd_ata" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end data directive" enabled="true" >+ name="!$acc end data">!$$acc end data${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.declare" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC declare directive" enabled="true" >+ name="!$acc declare">!$$acc declare ${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.host_data" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC host_data directive" enabled="true" >+ name="!$acc host_data">!$$acc host_data${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_host_data" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end host_data directive" enabled="true" >+ name="!$acc end host_data">!$$acc end host_data${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.kernels" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC kernels directive" enabled="true" >+ name="!$acc kernels">!$$acc kernels${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_kernels" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end kernels directive" enabled="true" >+ name="!$acc end kernels">!$$acc end kernels${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.kernels_loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC kernels loop directive" enabled="true" >+ name="!$acc kernels loop">!$$acc kernels loop${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_kernels_loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end kernels loop directive" enabled="true" >+ name="!$acc end kernels loop">!$$acc end kernels loop${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC loop directive" enabled="true" >+ name="!$acc loop">!$$acc loop${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end loop directive" enabled="true" >+ name="!$acc end loop">!$$acc end loop${cursor}</template> > <template id="org.eclipse.ptp.pldt.openacc.fortran.parallel" > autoinsert="true" context="org.eclipse.photran.ui.template.context" > deleted="false" description="OpenACC parallel directive" enabled="true" > name="!$acc parallel">!$$acc parallel${cursor}</template> >-</templates> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_parallel" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end parallel directive" enabled="true" >+ name="!$acc end parallel">!$$acc end parallel${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.parallel_loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC parallel loop directive" enabled="true" >+ name="!$acc parallel loop">!$$acc parallel loop${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.end_parallel_loop" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC end parallel loop directive" enabled="true" >+ name="!$acc end parallel loop">!$$acc end parallel loop${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.update" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC update directive" enabled="true" >+ name="!$acc update">!$$acc update ${cursor}</template> >+ <template id="org.eclipse.ptp.pldt.openacc.fortran.wait" >+ autoinsert="true" context="org.eclipse.photran.ui.template.context" >+ deleted="false" description="OpenACC wait directive" enabled="true" >+ name="!$acc wait">!$$acc wait${cursor}</template> >+</templates> >\ No newline at end of file >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc/build.properties tools/pldt/org.eclipse.ptp.pldt.openacc/build.properties >index a52b1e7..07d2b05 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc/build.properties >+++ tools/pldt/org.eclipse.ptp.pldt.openacc/build.properties >@@ -11,5 +11,6 @@ bin.includes = META-INF/,\ > about.mappings,\ > about.properties,\ > ptp_logo_icon32.png,\ >- templates/ >+ templates/,\ >+ schema/ > jre.compilation.profile = JavaSE-1.6 >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc/plugin.xml tools/pldt/org.eclipse.ptp.pldt.openacc/plugin.xml >index 436b832..fa89ed2 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc/plugin.xml >+++ tools/pldt/org.eclipse.ptp.pldt.openacc/plugin.xml >@@ -93,6 +93,21 @@ > </initializer> > </extension> > >+ <!-- OpenACC artifact analysis extension point --> >+ <extension-point >+ id="artifactAnalysis" >+ name="OpenACC Artifact Analysis" >+ schema="schema/artifactAnalysis.exsd"/> >+ <!-- OpenACC atifact analyses for C and C++ --> >+ <extension point="org.eclipse.ptp.pldt.openacc.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.gcc" >+ class="org.eclipse.ptp.pldt.openacc.internal.actions.OpenACCCArtifactAnalysis" /> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.g++" >+ class="org.eclipse.ptp.pldt.openacc.internal.actions.OpenACCCArtifactAnalysis" /> >+ </extension> >+ > <!-- OpenACC C help book --> > <extension > point="org.eclipse.cdt.ui.CHelpProvider"> >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc/schema/artifactAnalysis.exsd tools/pldt/org.eclipse.ptp.pldt.openacc/schema/artifactAnalysis.exsd >new file mode 100644 >index 0000000..f2662aa >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openacc/schema/artifactAnalysis.exsd >@@ -0,0 +1,88 @@ >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.ptp.pldt.mpi.core" xmlns="http://www.w3.org/2001/XMLSchema"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.ptp.pldt.mpi.core" id="artifactAnalysis" name="OpenACC Artifact Analysis"/> >+ </appInfo> >+ <documentation> >+ Allows plug-ins to contribute OpenACC artifact analyses. >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <annotation> >+ <appInfo> >+ <meta.element /> >+ </appInfo> >+ </annotation> >+ <complexType> >+ <sequence minOccurs="1" maxOccurs="unbounded"> >+ <element ref="artifactAnalysis"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="artifactAnalysis"> >+ <complexType> >+ <attribute name="languageID" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="identifier" basedOn="org.eclipse.cdt.core.language/language/@id"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="class" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn=":org.eclipse.ptp.pldt.common.IArtifactAnalysis"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 6.0 >+ </documentation> >+ </annotation> >+ >+ >+ >+ >+ >+</schema> >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/OpenACCCArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/OpenACCCArtifactAnalysis.java >new file mode 100644 >index 0000000..8e0513e >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/OpenACCCArtifactAnalysis.java >@@ -0,0 +1,84 @@ >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >+ * Jeff Overbey (UIUC) - modified to use extension point >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.openacc.internal.actions; >+ >+import java.util.List; >+import java.util.regex.Pattern; >+ >+import org.eclipse.cdt.core.dom.ast.IASTFileLocation; >+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement; >+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; >+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.ptp.pldt.common.Artifact; >+import org.eclipse.ptp.pldt.common.ArtifactAnalysisBase; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+import org.eclipse.ptp.pldt.common.util.SourceInfo; >+import org.eclipse.ptp.pldt.openacc.internal.messages.Messages; >+ >+/** >+ * OpenACC artifact analysis for C and C++. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.openacc.artifactAnalysis</code> extension point. >+ * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey >+ */ >+public class OpenACCCArtifactAnalysis extends ArtifactAnalysisBase implements IArtifactAnalysis { >+ >+ private static final Pattern ACC_PRAGMA_PATTERN = Pattern >+ .compile("acc[ \t]*(parallel|kernels|data|host_data|loop|cache|declare|update|wait).*"); //$NON-NLS-1$ >+ >+ @Override >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final ScanReturn msr = new ScanReturn(); >+ final IASTTranslationUnit atu = getAST(tu); // use index; was tu.getAST(); >+ if (atu != null) { >+ findOpenACCFunctionCalls(includes, msr, tu.getElementName(), atu, allowPrefixOnlyMatch); >+ findOpenACCPragmas(atu, msr); >+ } >+ return msr; >+ } >+ >+ private void findOpenACCFunctionCalls(final List<String> includes, >+ final ScanReturn msr, final String fileName, >+ final IASTTranslationUnit atu, boolean allowPrefixOnlyMatch) { >+ atu.accept(new OpenACCCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >+ } >+ >+ private void findOpenACCPragmas(final IASTTranslationUnit atu, final ScanReturn msr) { >+ for (final IASTPreprocessorStatement preprocStmt : atu.getAllPreprocessorStatements()) { >+ if (preprocStmt instanceof IASTPreprocessorPragmaStatement) { >+ final String pragmaText = String.valueOf(((IASTPreprocessorPragmaStatement) preprocStmt).getMessage()).trim(); >+ if (preprocStmt.isPartOfTranslationUnitFile() && ACC_PRAGMA_PATTERN.matcher(pragmaText).matches()) { >+ final IASTFileLocation astFileLocation = preprocStmt.getFileLocation(); >+ final SourceInfo sourceInfo = new SourceInfo(); >+ sourceInfo.setStartingLine(astFileLocation.getStartingLineNumber()); >+ sourceInfo.setStart(astFileLocation.getNodeOffset()); >+ sourceInfo.setEnd(astFileLocation.getNodeOffset() + astFileLocation.getNodeLength()); >+ sourceInfo.setConstructType(Artifact.PRAGMA); >+ >+ msr.addArtifact( >+ new Artifact( >+ preprocStmt.getContainingFilename(), >+ astFileLocation.getStartingLineNumber(), >+ 1, >+ "#pragma " + pragmaText, //$NON-NLS-1$ >+ Messages.RunAnalyseOpenACCcommandHandler_OpenACC_directive, >+ sourceInfo, >+ null)); >+ } >+ } >+ } >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/RunAnalyseOpenACCcommandHandler.java tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/RunAnalyseOpenACCcommandHandler.java >index 8380984..d878e23 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/RunAnalyseOpenACCcommandHandler.java >+++ tools/pldt/org.eclipse.ptp.pldt.openacc/src/org/eclipse/ptp/pldt/openacc/internal/actions/RunAnalyseOpenACCcommandHandler.java >@@ -1,5 +1,5 @@ > /********************************************************************** >- * Copyright (c) 2007, 2011 IBM Corporation and University of Illinois. >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation and University of Illinois. > * 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 >@@ -7,30 +7,19 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >- * Jeff Overbey - adaptation to OpenACC >+ * Jeff Overbey - adaptation to OpenACC, modified to use extension point > *******************************************************************************/ > package org.eclipse.ptp.pldt.openacc.internal.actions; > > import java.util.List; >-import java.util.regex.Pattern; > >-import org.eclipse.cdt.core.dom.ast.IASTFileLocation; >-import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement; >-import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; >-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >-import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; >-import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; > import org.eclipse.cdt.core.model.ITranslationUnit; >-import org.eclipse.core.runtime.CoreException; >-import org.eclipse.ptp.pldt.common.Artifact; > import org.eclipse.ptp.pldt.common.ArtifactMarkingVisitor; > import org.eclipse.ptp.pldt.common.ScanReturn; > import org.eclipse.ptp.pldt.common.actions.RunAnalyseHandlerBase; >-import org.eclipse.ptp.pldt.common.util.SourceInfo; > import org.eclipse.ptp.pldt.common.util.ViewActivator; > import org.eclipse.ptp.pldt.openacc.internal.Activator; > import org.eclipse.ptp.pldt.openacc.internal.IDs; >-import org.eclipse.ptp.pldt.openacc.internal.messages.Messages; > > /** > * Handler for the "Show OpenACC Artifacts" command. >@@ -39,10 +28,15 @@ import org.eclipse.ptp.pldt.openacc.internal.messages.Messages; > * @author Jeff Overbey > */ > public class RunAnalyseOpenACCcommandHandler extends RunAnalyseHandlerBase { >+ /** >+ * ID for the OpenACC Artifacts view, contributed in plugin.xml. >+ */ > private static final String VIEW_ID = "org.eclipse.ptp.pldt.openacc.views.OpenACCArtifactView"; //$NON-NLS-1$ > >- private static final Pattern ACC_PRAGMA_PATTERN = Pattern >- .compile("acc[ \t]*(parallel|kernels|data|host_data|loop|cache|declare|update|wait).*"); //$NON-NLS-1$ >+ /** >+ * ID for the extension point which allows plug-ins to contribute OpenMP artifact analyses based on language IDs. >+ */ >+ private static final String EXTENSION_POINT_ID = "org.eclipse.ptp.pldt.openacc.artifactAnalysis"; //$NON-NLS-1$ > > /** > * Constructor. Invoked dynamically due to class reference in plugin.xml. >@@ -62,56 +56,8 @@ public class RunAnalyseOpenACCcommandHandler extends RunAnalyseHandlerBase { > */ > @Override > public ScanReturn doArtifactAnalysis(final ITranslationUnit tu, final List<String> includes) { >- final ScanReturn msr = new ScanReturn(); >- final boolean allowPrefixOnlyMatch = Activator.getDefault().getPreferenceStore() >- .getBoolean(IDs.PREF_RECOGNIZE_APIS_BY_PREFIX_ALONE); >- if (traceOn) >- { >- System.out.println("RALCH:OpenACC allowPrefixOnlyMatch=" + allowPrefixOnlyMatch); //$NON-NLS-1$ >- } >- try { >- final IASTTranslationUnit atu = tu.getAST(); >- final String languageID = tu.getLanguage().getId(); >- if (languageID.equals(GCCLanguage.ID) || languageID.equals(GPPLanguage.ID)) { >- findOpenACCFunctionCalls(includes, msr, tu.getElementName(), atu, allowPrefixOnlyMatch); >- findOpenACCPragmas(atu, msr); >- } >- } catch (final CoreException e) { >- Activator.log(e); >- } >- return msr; >- } >- >- private void findOpenACCFunctionCalls(final List<String> includes, >- final ScanReturn msr, final String fileName, >- final IASTTranslationUnit atu, boolean allowPrefixOnlyMatch) { >- atu.accept(new OpenACCCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >- } >- >- private void findOpenACCPragmas(final IASTTranslationUnit atu, final ScanReturn msr) { >- for (final IASTPreprocessorStatement preprocStmt : atu.getAllPreprocessorStatements()) { >- if (preprocStmt instanceof IASTPreprocessorPragmaStatement) { >- final String pragmaText = String.valueOf(((IASTPreprocessorPragmaStatement) preprocStmt).getMessage()).trim(); >- if (preprocStmt.isPartOfTranslationUnitFile() && ACC_PRAGMA_PATTERN.matcher(pragmaText).matches()) { >- final IASTFileLocation astFileLocation = preprocStmt.getFileLocation(); >- final SourceInfo sourceInfo = new SourceInfo(); >- sourceInfo.setStartingLine(astFileLocation.getStartingLineNumber()); >- sourceInfo.setStart(astFileLocation.getNodeOffset()); >- sourceInfo.setEnd(astFileLocation.getNodeOffset() + astFileLocation.getNodeLength()); >- sourceInfo.setConstructType(Artifact.PRAGMA); >- >- msr.addArtifact( >- new Artifact( >- preprocStmt.getContainingFilename(), >- astFileLocation.getStartingLineNumber(), >- 1, >- "#pragma " + pragmaText, //$NON-NLS-1$ >- Messages.RunAnalyseOpenACCcommandHandler_OpenACC_directive, >- sourceInfo, >- null)); >- } >- } >- } >+ final boolean allowPrefixOnlyMatch = Activator.getDefault().getPreferenceStore().getBoolean(IDs.PREF_RECOGNIZE_APIS_BY_PREFIX_ALONE); >+ return runArtifactAnalysisFromExtensionPoint(EXTENSION_POINT_ID, tu, includes, allowPrefixOnlyMatch); > } > > @Override >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.core/build.properties tools/pldt/org.eclipse.ptp.pldt.openmp.core/build.properties >index 04cc212..dd2afe1 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openmp.core/build.properties >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.core/build.properties >@@ -7,5 +7,6 @@ bin.includes = META-INF/,\ > samples/,\ > plugin.properties,\ > html/,\ >- about.html >+ about.html,\ >+ schema/ > bin.excludes = icons/.cvsignore >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.core/plugin.xml tools/pldt/org.eclipse.ptp.pldt.openmp.core/plugin.xml >index 1d1991c..7ca4fbf 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openmp.core/plugin.xml >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.core/plugin.xml >@@ -105,4 +105,20 @@ > class="org.eclipse.ptp.pldt.openmp.core.prefs.OpenMPPreferenceInitializer"> > </initializer> > </extension> >+ >+ <!-- Artifact analysis extension point --> >+ <extension-point >+ id="artifactAnalysis" >+ name="OpenMP Artifact Analysis" >+ schema="schema/artifactAnalysis.exsd"/> >+ <!-- Artifact analysis for C --> >+ <extension point="org.eclipse.ptp.pldt.openmp.core.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.gcc" >+ class="org.eclipse.ptp.pldt.openmp.core.analysis.OpenMPCArtifactAnalysis" /> >+ <artifactAnalysis >+ languageID="org.eclipse.cdt.core.g++" >+ class="org.eclipse.ptp.pldt.openmp.core.analysis.OpenMPCArtifactAnalysis" /> >+ </extension> >+ > </plugin> >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.core/schema/artifactAnalysis.exsd tools/pldt/org.eclipse.ptp.pldt.openmp.core/schema/artifactAnalysis.exsd >new file mode 100644 >index 0000000..ceab837 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.core/schema/artifactAnalysis.exsd >@@ -0,0 +1,88 @@ >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.ptp.pldt.mpi.core" xmlns="http://www.w3.org/2001/XMLSchema"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.ptp.pldt.mpi.core" id="artifactAnalysis" name="OpenMP Artifact Analysis"/> >+ </appInfo> >+ <documentation> >+ Allows plug-ins to contribute OpenMP artifact analyses. >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <annotation> >+ <appInfo> >+ <meta.element /> >+ </appInfo> >+ </annotation> >+ <complexType> >+ <sequence minOccurs="1" maxOccurs="unbounded"> >+ <element ref="artifactAnalysis"/> >+ </sequence> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="artifactAnalysis"> >+ <complexType> >+ <attribute name="languageID" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="identifier" basedOn="org.eclipse.cdt.core.language/language/@id"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="class" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn=":org.eclipse.ptp.pldt.common.IArtifactAnalysis"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 6.0 >+ </documentation> >+ </annotation> >+ >+ >+ >+ >+ >+</schema> >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/actions/RunAnalyseOpenMPcommandHandler.java tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/actions/RunAnalyseOpenMPcommandHandler.java >index b4ee3e2..d94bd78 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/actions/RunAnalyseOpenMPcommandHandler.java >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/actions/RunAnalyseOpenMPcommandHandler.java >@@ -1,5 +1,5 @@ >-/********************************************************************** >- * Copyright (c) 2007,2011 IBM Corporation. >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >@@ -7,42 +7,27 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Jeff Overbey (UIUC) - modified to use extension point > *******************************************************************************/ >- > package org.eclipse.ptp.pldt.openmp.core.actions; > >-import java.lang.reflect.Method; > import java.util.HashMap; > import java.util.Iterator; > import java.util.List; > import java.util.Map; > >-import org.eclipse.cdt.core.dom.ast.IASTFileLocation; >-import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; >-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >-import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; >-import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; >-import org.eclipse.cdt.core.model.ILanguage; > import org.eclipse.cdt.core.model.ITranslationUnit; >-import org.eclipse.core.resources.IFile; > import org.eclipse.core.resources.IResource; > import org.eclipse.core.runtime.CoreException; > import org.eclipse.ptp.pldt.common.Artifact; > import org.eclipse.ptp.pldt.common.ScanReturn; > import org.eclipse.ptp.pldt.common.actions.RunAnalyseHandlerBase; >-import org.eclipse.ptp.pldt.common.util.SourceInfo; > import org.eclipse.ptp.pldt.common.util.ViewActivator; >-import org.eclipse.ptp.pldt.openmp.analysis.OpenMPAnalysisManager; > import org.eclipse.ptp.pldt.openmp.analysis.OpenMPError; >-import org.eclipse.ptp.pldt.openmp.analysis.OpenMPErrorManager; >-import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTNode; >-import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTPragma; > import org.eclipse.ptp.pldt.openmp.core.OpenMPArtifactMarkingVisitor; > import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin; > import org.eclipse.ptp.pldt.openmp.core.OpenMPScanReturn; >-import org.eclipse.ptp.pldt.openmp.core.analysis.OpenMPCASTVisitor; > import org.eclipse.ptp.pldt.openmp.core.internal.OpenMPIDs; >-import org.eclipse.ptp.pldt.openmp.core.messages.Messages; > import org.eclipse.ptp.pldt.openmp.ui.pv.internal.IDs; > import org.eclipse.ptp.pldt.openmp.ui.pv.views.ProblemMarkerAttrIds; > import org.eclipse.ui.texteditor.MarkerUtilities; >@@ -53,7 +38,11 @@ import org.eclipse.ui.texteditor.MarkerUtilities; > * > */ > public class RunAnalyseOpenMPcommandHandler extends RunAnalyseHandlerBase { >- private static final String OPENMP_DIRECTIVE = Messages.RunAnalyseOpenMPcommandHandler_OpenMP_directive; >+ /** >+ * ID for the extension point which allows plug-ins to contribute OpenMP artifact analyses based on language IDs. >+ */ >+ private static final String EXTENSION_POINT_ID = "org.eclipse.ptp.pldt.openmp.core.artifactAnalysis"; >+ > private static final boolean traceOn = false; > > /** >@@ -73,122 +62,8 @@ public class RunAnalyseOpenMPcommandHandler extends RunAnalyseHandlerBase { > */ > @Override > public ScanReturn doArtifactAnalysis(final ITranslationUnit tu, final List<String> includes) { >- OpenMPScanReturn msr = new OpenMPScanReturn(); >- final String fileName = tu.getElementName(); >- IASTTranslationUnit atu = null; >- ILanguage lang; >- boolean allowPrefixOnlyMatch = OpenMPPlugin.getDefault().getPreferenceStore() >- .getBoolean(OpenMPIDs.OPENMP_RECOGNIZE_APIS_BY_PREFIX_ALONE); >- try { >- lang = tu.getLanguage(); >- >- // atu = tu.getAST(); >- atu = getAST(tu); // use index; was tu.getAST(); otherwise fortran fails? >- String languageID = lang.getId(); >- >- if (languageID.equals(GCCLanguage.ID) || languageID.equals(GPPLanguage.ID)) { >- // null IASTTranslationUnit when we're doing C/C++ means we should quit. >- // but want to continue to see if this is a fortran file we are analyzing. >- if (atu == null) {// this is null for Fortran file during JUnit testing. >- System.out.println("RunAnalyseOpenMPCommandHandler.doArtifactAnalysis(), atu is null (testing?)"); //$NON-NLS-1$ >- return msr; >- } >- } >- >- if (languageID.equals(GCCLanguage.ID)) {// cdt40 >- atu.accept(new OpenMPCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >- } else { >- // Attempt to handle Fortran >- // Instantiate using reflection to avoid static Photran >- // dependencies >- try { >- Class<?> c = Class.forName("org.eclipse.ptp.pldt.openmp.fortran.actions.AnalyseOpenMPFortranHandler"); //$NON-NLS-1$ >- Method method = c.getMethod("run", String.class, ITranslationUnit.class, String.class, ScanReturn.class); //$NON-NLS-1$ >- method.invoke(c.newInstance(), languageID, tu, fileName, msr); >- } catch (Exception e) { >- System.err.println("RunAnalyseOpenMPcommandHandler.doArtifactAnalysis: Photran not installed"); //$NON-NLS-1$ >- } >- } >- } catch (CoreException e) { >- // TODO Auto-generated catch block >- e.printStackTrace(); >- } >- IResource res = tu.getResource(); >- IFile file = null; >- if (res instanceof IFile) { >- file = (IFile) res; >- } else { >- System.out.println("RunAnalyseOpenMP.doArtifactAnalysis, file cast won't work..."); //$NON-NLS-1$ >- } >- // Find the OpenMP #pragmas >- if (atu != null) { // not for Fortran >- processOpenMPPragmas(msr, atu, file); >- } >- return msr; >- } >- >- /** >- * Special processing to find #pragmas, since the CDT AST does not normally include them.<br> >- * Also adds the "OpenMP Problems" >- * >- * @param msr >- * @param astTransUnit >- * @param iFile >- */ >- protected void processOpenMPPragmas(OpenMPScanReturn msr, IASTTranslationUnit astTransUnit, IFile iFile) { >- OpenMPAnalysisManager omgr = new OpenMPAnalysisManager(astTransUnit, iFile); >- PASTNode[] pList = omgr.getPAST(); >- >- for (int i = 0; i < pList.length; i++) {// length local=3271; remote 4 (!!) >- PASTNode temp = pList[i]; >- String tempStr = temp.getRawSignature(); >- // local: will be a PASTOMPPragma node; remote: will be a PASTPragma node. >- // So workaround is to accept a PASTPragma node here so we can handle remote files. >- // Need to investigate what this does to further analysis e.g. concurrency analysis. >- if (pList[i] instanceof PASTPragma) {// was PASTOMPPragma >- >- PASTPragma pop = (PASTPragma) pList[i]; >- if (traceOn) { >- System.out.println("found #pragma, line " + pop.getStartingLine()); //$NON-NLS-1$ >- } >- SourceInfo si = getSourceInfo(pop, Artifact.PRAGMA); >- String shortName = pop.getContent(); >- if (shortName.length() == 0) { >- shortName = "#pragma"; // HACK: workaround for remote files where getContent() is always empty. >- // The same reason why this is empty is also (I think) why it's not a PASTOMPPragma node. >- // PASTOMPFactory.parse() always finds empty token first on a remote file, so aborts. >- } >- Artifact a = new Artifact(pop.getFilename(), pop.getStartingLine(), pop.getStartLocation(), shortName, >- OPENMP_DIRECTIVE, si, pop); >- msr.addArtifact(a); >- } >- } >- >- msr.addProblems(OpenMPErrorManager.getCurrentErrorManager().getErrors()); >- } >- >- /** >- * Get exact source locational info for a function call >- * >- * @param pastNode >- * @param constructType >- * @return >- */ >- private SourceInfo getSourceInfo(PASTNode pastNode, int constructType) { >- SourceInfo sourceInfo = null; >- IASTNodeLocation[] locations = pastNode.getNodeLocations(); >- if (locations.length == 1) { >- IASTFileLocation astFileLocation = null; >- if (locations[0] instanceof IASTFileLocation) { >- astFileLocation = (IASTFileLocation) locations[0]; >- sourceInfo = new SourceInfo(); >- sourceInfo.setStartingLine(astFileLocation.getStartingLineNumber()); >- sourceInfo.setStart(astFileLocation.getNodeOffset()); >- sourceInfo.setEnd(astFileLocation.getNodeOffset() + astFileLocation.getNodeLength()); >- sourceInfo.setConstructType(constructType); >- } >- } >- return sourceInfo; >+ boolean allowPrefixOnlyMatch = OpenMPPlugin.getDefault().getPreferenceStore().getBoolean(OpenMPIDs.OPENMP_RECOGNIZE_APIS_BY_PREFIX_ALONE); >+ return runArtifactAnalysisFromExtensionPoint(EXTENSION_POINT_ID, tu, includes, allowPrefixOnlyMatch); > } > > /** >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/analysis/OpenMPCArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/analysis/OpenMPCArtifactAnalysis.java >new file mode 100644 >index 0000000..339f466 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.core/src/org/eclipse/ptp/pldt/openmp/core/analysis/OpenMPCArtifactAnalysis.java >@@ -0,0 +1,125 @@ >+/******************************************************************************* >+ * Copyright (c) 2007, 2011, 2012 IBM Corporation, University of Illinois, 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 >+ * Jeff Overbey (UIUC) - modified to use extension point >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.openmp.core.analysis; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.dom.ast.IASTFileLocation; >+import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; >+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.ptp.pldt.common.Artifact; >+import org.eclipse.ptp.pldt.common.ArtifactAnalysisBase; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+import org.eclipse.ptp.pldt.common.util.SourceInfo; >+import org.eclipse.ptp.pldt.openmp.analysis.OpenMPAnalysisManager; >+import org.eclipse.ptp.pldt.openmp.analysis.OpenMPErrorManager; >+import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTNode; >+import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTPragma; >+import org.eclipse.ptp.pldt.openmp.core.OpenMPScanReturn; >+import org.eclipse.ptp.pldt.openmp.core.messages.Messages; >+ >+/** >+ * OpenMP artifact analysis for C. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.openmp.core.artifactAnalysis</code> extension point. >+ * >+ * @author Beth Tibbitts >+ * @author Jeff Overbey >+ */ >+public class OpenMPCArtifactAnalysis extends ArtifactAnalysisBase implements IArtifactAnalysis { >+ >+ private static final String OPENMP_DIRECTIVE = Messages.RunAnalyseOpenMPcommandHandler_OpenMP_directive; >+ >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final OpenMPScanReturn msr = new OpenMPScanReturn(); >+ final String fileName = tu.getElementName(); >+ final IASTTranslationUnit atu = getAST(tu); // use index; was tu.getAST() >+ if (atu != null) { >+ atu.accept(new OpenMPCASTVisitor(includes, fileName, allowPrefixOnlyMatch, msr)); >+ >+ // Find the OpenMP #pragmas >+ if (tu.getResource() instanceof IFile) { >+ processOpenMPPragmas(msr, atu, (IFile) tu.getResource()); >+ } >+ } >+ return msr; >+ } >+ >+ >+ /** >+ * Special processing to find #pragmas, since the CDT AST does not normally include them.<br> >+ * Also adds the "OpenMP Problems" >+ * >+ * @param msr >+ * @param astTransUnit >+ * @param iFile >+ */ >+ protected void processOpenMPPragmas(OpenMPScanReturn msr, IASTTranslationUnit astTransUnit, IFile iFile) { >+ OpenMPAnalysisManager omgr = new OpenMPAnalysisManager(astTransUnit, iFile); >+ PASTNode[] pList = omgr.getPAST(); >+ >+ for (int i = 0; i < pList.length; i++) {// length local=3271; remote 4 (!!) >+ PASTNode temp = pList[i]; >+ String tempStr = temp.getRawSignature(); >+ // local: will be a PASTOMPPragma node; remote: will be a PASTPragma node. >+ // So workaround is to accept a PASTPragma node here so we can handle remote files. >+ // Need to investigate what this does to further analysis e.g. concurrency analysis. >+ if (pList[i] instanceof PASTPragma) {// was PASTOMPPragma >+ >+ PASTPragma pop = (PASTPragma) pList[i]; >+ //if (traceOn) { >+ // System.out.println("found #pragma, line " + pop.getStartingLine()); //$NON-NLS-1$ >+ //} >+ SourceInfo si = getSourceInfo(pop, Artifact.PRAGMA); >+ String shortName = pop.getContent(); >+ if (shortName.length() == 0) { >+ shortName = "#pragma"; // HACK: workaround for remote files where getContent() is always empty. >+ // The same reason why this is empty is also (I think) why it's not a PASTOMPPragma node. >+ // PASTOMPFactory.parse() always finds empty token first on a remote file, so aborts. >+ } >+ Artifact a = new Artifact(pop.getFilename(), pop.getStartingLine(), pop.getStartLocation(), shortName, >+ OPENMP_DIRECTIVE, si, pop); >+ msr.addArtifact(a); >+ } >+ } >+ >+ msr.addProblems(OpenMPErrorManager.getCurrentErrorManager().getErrors()); >+ } >+ >+ >+ /** >+ * Get exact source locational info for a function call >+ * >+ * @param pastNode >+ * @param constructType >+ * @return >+ */ >+ private SourceInfo getSourceInfo(PASTNode pastNode, int constructType) { >+ SourceInfo sourceInfo = null; >+ IASTNodeLocation[] locations = pastNode.getNodeLocations(); >+ if (locations.length == 1) { >+ IASTFileLocation astFileLocation = null; >+ if (locations[0] instanceof IASTFileLocation) { >+ astFileLocation = (IASTFileLocation) locations[0]; >+ sourceInfo = new SourceInfo(); >+ sourceInfo.setStartingLine(astFileLocation.getStartingLineNumber()); >+ sourceInfo.setStart(astFileLocation.getNodeOffset()); >+ sourceInfo.setEnd(astFileLocation.getNodeOffset() + astFileLocation.getNodeLength()); >+ sourceInfo.setConstructType(constructType); >+ } >+ } >+ return sourceInfo; >+ } >+} >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/build.properties tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/build.properties >index b67aba1..1500166 100644 >--- tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/build.properties >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/build.properties >@@ -3,4 +3,5 @@ output.. = bin/ > bin.includes = META-INF/,\ > .,\ > plugin.properties,\ >- about.html >+ about.html,\ >+ plugin.xml >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/plugin.xml tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/plugin.xml >new file mode 100644 >index 0000000..f966ca0 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/plugin.xml >@@ -0,0 +1,12 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<?eclipse version="3.4"?> >+<plugin> >+ >+ <!-- OpenMP artifact analysis for Fortran --> >+ <extension point="org.eclipse.ptp.pldt.openmp.core.artifactAnalysis"> >+ <artifactAnalysis >+ languageID="org.eclipse.photran.cdtinterface.fortran" >+ class="org.eclipse.ptp.pldt.openmp.fortran.analysis.OpenMPFortranArtifactAnalysis" /> >+ </extension> >+ >+</plugin> >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/actions/AnalyseOpenMPFortranHandler.java tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/actions/AnalyseOpenMPFortranHandler.java >deleted file mode 100644 >index 87587c1..0000000 >--- tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/actions/AnalyseOpenMPFortranHandler.java >+++ /dev/null >@@ -1,43 +0,0 @@ >-/********************************************************************** >- * 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.actions; >- >-import org.eclipse.cdt.core.model.ITranslationUnit; >-import org.eclipse.core.resources.IFile; >-import org.eclipse.core.resources.IResource; >-import org.eclipse.photran.internal.cdtinterface.core.FortranLanguage; >-import org.eclipse.photran.internal.core.lexer.ASTLexerFactory; >-import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode; >-import org.eclipse.photran.internal.core.parser.Parser; >-import org.eclipse.ptp.pldt.common.ScanReturn; >-import org.eclipse.ptp.pldt.openmp.fortran.analysis.OpenMPFortranASTVisitor; >- >-/** >- * @since 4.0 >- */ >-public class AnalyseOpenMPFortranHandler { >- public void run(String languageID, ITranslationUnit tu, String fileName, ScanReturn msr) { >- if (languageID.equals(FortranLanguage.LANGUAGE_ID)) { >- IResource res = tu.getUnderlyingResource(); >- if (!(res instanceof IFile)) >- throw new IllegalStateException(); >- IFile file = (IFile) res; >- >- try { >- ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(file)); >- ast.accept(new OpenMPFortranASTVisitor(fileName, msr)); >- } catch (Exception e) { >- e.printStackTrace(); // TODO >- } >- } >- } >-} >diff --git tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/analysis/OpenMPFortranArtifactAnalysis.java tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/analysis/OpenMPFortranArtifactAnalysis.java >new file mode 100644 >index 0000000..c301aa1 >--- /dev/null >+++ tools/pldt/org.eclipse.ptp.pldt.openmp.fortran/src/org/eclipse/ptp/pldt/openmp/fortran/analysis/OpenMPFortranArtifactAnalysis.java >@@ -0,0 +1,51 @@ >+/******************************************************************************* >+ * Copyright (c) 2012 University of Illinois at Urbana-Champaign 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: >+ * UIUC - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ptp.pldt.openmp.fortran.analysis; >+ >+import java.util.List; >+ >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.photran.internal.cdtinterface.core.FortranLanguage; >+import org.eclipse.photran.internal.core.lexer.ASTLexerFactory; >+import org.eclipse.photran.internal.core.parser.ASTExecutableProgramNode; >+import org.eclipse.photran.internal.core.parser.Parser; >+import org.eclipse.ptp.pldt.common.IArtifactAnalysis; >+import org.eclipse.ptp.pldt.common.ScanReturn; >+ >+/** >+ * OpenMP artifact analysis for Fortran. >+ * <p> >+ * Contributed to the <code>org.eclipse.ptp.pldt.mpi.core.artifactAnalysis</code> extension point. >+ * >+ * @author Jeff Overbey >+ */ >+public class OpenMPFortranArtifactAnalysis implements IArtifactAnalysis { >+ public ScanReturn runArtifactAnalysis(String languageID, ITranslationUnit tu, List<String> includes, boolean allowPrefixOnlyMatch) { >+ final ScanReturn msr = new ScanReturn(); >+ final String fileName = tu.getElementName(); >+ if (languageID.equals(FortranLanguage.LANGUAGE_ID)) { >+ IResource res = tu.getUnderlyingResource(); >+ if (!(res instanceof IFile)) >+ throw new IllegalStateException(); >+ IFile file = (IFile) res; >+ >+ try { >+ ASTExecutableProgramNode ast = new Parser().parse(new ASTLexerFactory().createLexer(file)); >+ ast.accept(new OpenMPFortranASTVisitor(fileName, msr)); >+ } catch (Exception e) { >+ e.printStackTrace(); // TODO >+ } >+ } >+ return msr; >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
g.watson
:
iplog-
Actions:
View
|
Diff
Attachments on
bug 373597
: 212258