Bug 312002 (procs in INTERFACE blocks are now shown in the Outline view)
diff --git a/org.eclipse.photran.cdtinterface.vpg/model/org/eclipse/photran/internal/core/model/FortranModelBuildingVisitor.java b/org.eclipse.photran.cdtinterface.vpg/model/org/eclipse/photran/internal/core/model/FortranModelBuildingVisitor.java
index e663c71..57f2c62 100644
--- a/org.eclipse.photran.cdtinterface.vpg/model/org/eclipse/photran/internal/core/model/FortranModelBuildingVisitor.java
+++ b/org.eclipse.photran.cdtinterface.vpg/model/org/eclipse/photran/internal/core/model/FortranModelBuildingVisitor.java
@@ -15,10 +15,13 @@
import org.eclipse.photran.internal.core.parser.ASTGenericBindingNode;
import org.eclipse.photran.internal.core.parser.ASTGenericSpecNode;
import org.eclipse.photran.internal.core.parser.ASTInterfaceBlockNode;
+import org.eclipse.photran.internal.core.parser.ASTInterfaceBodyNode;
import org.eclipse.photran.internal.core.parser.ASTIntrinsicListNode;
import org.eclipse.photran.internal.core.parser.ASTIntrinsicStmtNode;
import org.eclipse.photran.internal.core.parser.ASTMainProgramNode;
import org.eclipse.photran.internal.core.parser.ASTModuleNode;
+import org.eclipse.photran.internal.core.parser.ASTModuleProcedureStmtNode;
+import org.eclipse.photran.internal.core.parser.ASTProcedureNameListNode;
import org.eclipse.photran.internal.core.parser.ASTSpecificBindingNode;
import org.eclipse.photran.internal.core.parser.ASTStmtFunctionStmtNode;
import org.eclipse.photran.internal.core.parser.ASTSubmoduleNode;
@@ -219,15 +222,36 @@
{
IASTListNode<ASTExternalNameListNode> list = node.getExternalNameList();
for (int i = 0; i < list.size(); i++)
- addToModel(node, setPos(new FortranElement.Variable(getCurrentParent(), list.get(i).getExternalName()), node));
+ addToModel(node, setPos(new FortranElement.Subprogram(getCurrentParent(), list.get(i).getExternalName()), node));
}
public void visitASTInterfaceBlockNode(ASTInterfaceBlockNode node)
{
Token token = node.getInterfaceStmt().getGenericName() == null
- ? null
+ ? node.getInterfaceStmt().getInterfaceToken()
: node.getInterfaceStmt().getGenericName().getGenericName();
- addToModel(node, setPos(new FortranElement.Variable(getCurrentParent(), token), node));
+ addToModel(node, setPos(new FortranElement.Subprogram(getCurrentParent(), token), node));
+ }
+
+ public void visitASTInterfaceBodyNode(ASTInterfaceBodyNode node)
+ {
+ if (node.getFunctionStmt() != null)
+ {
+ Token token = node.getFunctionStmt().getFunctionName().getFunctionName();
+ addToModel(node, setPos(new FortranElement.Function(getCurrentParent(), token), node));
+ }
+ else if (node.getSubroutineStmt() != null)
+ {
+ Token token = node.getSubroutineStmt().getSubroutineName().getSubroutineName();
+ addToModel(node, setPos(new FortranElement.Subroutine(getCurrentParent(), token), node));
+ }
+ }
+
+ public void visitASTModuleProcedureStmtNode(ASTModuleProcedureStmtNode node)
+ {
+ IASTListNode<ASTProcedureNameListNode> list = node.getProcedureNameList();
+ for (int i = 0; i < list.size(); i++)
+ addToModel(node, setPos(new FortranElement.Subprogram(getCurrentParent(), list.get(i).getProcedureName()), node));
}
public void visitASTIntrinsicStmtNode(ASTIntrinsicStmtNode node)
diff --git a/org.eclipse.photran.cdtinterface/model/org/eclipse/photran/internal/core/model/FortranElement.java b/org.eclipse.photran.cdtinterface/model/org/eclipse/photran/internal/core/model/FortranElement.java
index a651158..bee4e97 100644
--- a/org.eclipse.photran.cdtinterface/model/org/eclipse/photran/internal/core/model/FortranElement.java
+++ b/org.eclipse.photran.cdtinterface/model/org/eclipse/photran/internal/core/model/FortranElement.java
@@ -320,6 +320,28 @@
}
/**
+ * An element representing a subroutine or function when we're not sure
+ * which one it is (e.g., in an EXTERNAL or MODULE PROCEDURE statement)
+ */
+ public static class Subprogram extends FortranElement
+ {
+ public Subprogram(Parent parent, IToken nameToken)
+ {
+ super(parent, nameToken);
+ }
+
+ public ImageDescriptor getBaseImageDescriptor()
+ {
+ return imageDescriptor();
+ }
+
+ public static ImageDescriptor imageDescriptor()
+ {
+ return getImageDescriptorForIcon("subroutine.gif");
+ }
+ }
+
+ /**
* An element representing an interface declaration (INTERFACE ... END INTERFACE).
*/
public static class Interface extends FortranElement