Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Overbey2009-01-07 21:39:42 +0000
committerJeffrey Overbey2009-01-07 21:39:42 +0000
commitda03d2609507dc2e83dc9ea09beb511d5a1a5a1c (patch)
tree5a57996aa4990da1cd208841d8dfbbbd6f707271
parent99831bdc1ecf834252f423835c4842cf6101fcac (diff)
downloadorg.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.tar.gz
org.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.tar.xz
org.eclipse.photran-da03d2609507dc2e83dc9ea09beb511d5a1a5a1c.zip
Added unit tests for subprogram-interface linkage
-rw-r--r--org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f903
-rw-r--r--org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f903
-rw-r--r--org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f9026
-rw-r--r--org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f906
-rw-r--r--org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java106
-rw-r--r--org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java3
6 files changed, 146 insertions, 1 deletions
diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90
new file mode 100644
index 00000000..26fbfbfa
--- /dev/null
+++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition1.f90
@@ -0,0 +1,3 @@
+integer function f() ! 1,18
+ f = 1
+end function
diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90
new file mode 100644
index 00000000..4fd6bcd1
--- /dev/null
+++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/definition2.f90
@@ -0,0 +1,3 @@
+integer function f() ! 1,18
+ f = 2
+end function
diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90
new file mode 100644
index 00000000..4eb5aeb0
--- /dev/null
+++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface1.f90
@@ -0,0 +1,26 @@
+interface
+ integer function f() ! 2,20
+ end function
+end interface
+
+contains
+
+ subroutine s1(f)
+ interface
+ integer function f() ! 10,14 Subroutine parameter -- should not bind
+ end function
+ end interface
+ end subroutine
+
+ subroutine s2
+ interface
+ integer function f() ! 17,24
+ end function
+ end interface
+ end subroutine
+
+end program
+
+integer function f() ! 24,18
+ f = 0
+end function
diff --git a/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90 b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90
new file mode 100644
index 00000000..039ce2e4
--- /dev/null
+++ b/org.eclipse.photran.core.vpg.tests/interface-test-code/interface2.f90
@@ -0,0 +1,6 @@
+interface
+ integer function f() ! 2,20
+ end function
+end interface
+
+end program
diff --git a/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java b/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java
new file mode 100644
index 00000000..730afca2
--- /dev/null
+++ b/org.eclipse.photran.core.vpg.tests/src/org/eclipse/photran/internal/core/tests/h_interface_links/InterfaceLinkTestCase.java
@@ -0,0 +1,106 @@
+package org.eclipse.photran.internal.core.tests.h_interface_links;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.photran.core.IFortranAST;
+import org.eclipse.photran.core.vpg.PhotranVPG;
+import org.eclipse.photran.internal.core.analysis.binding.Definition;
+import org.eclipse.photran.internal.core.lexer.Token;
+import org.eclipse.photran.refactoring.tests.RefactoringTestCase;
+
+public class InterfaceLinkTestCase extends RefactoringTestCase
+{
+ private static final String DIR = "interface-test-code";
+
+ private IFile interface1;
+ private IFile definition1;
+ private IFile definition2;
+ private IFile interface2;
+
+ private Definition if1;
+ private Definition if2;
+ private Definition if3;
+ private Definition if4;
+ private Definition def1;
+ private Definition def2;
+ private Definition def3;
+
+ @Override public void setUp() throws Exception
+ {
+ super.setUp();
+
+ /* The four files are imported in this order so that
+ * the INTERFACE block in the first file is seen /before/
+ * all of the corresponding subprogram declarations,
+ * while the INTERFACE block in the last file is seen
+ * /after/ all of the corresponding subprograms.
+ */
+
+ interface1 = importFile(DIR, "interface1.f90");
+ definition1 = importFile(DIR, "definition1.f90");
+ definition2 = importFile(DIR, "definition2.f90");
+ interface2 = importFile(DIR, "interface2.f90");
+ // File Line Column
+ if1 = findDefinition(interface1, 2, 20); // Ordinary INTERFACE block
+ if2 = findDefinition(interface1, 10, 24); // INTERFACE block for a subprogram parameter
+ if3 = findDefinition(interface1, 17, 24); // Ordinary INTERFACE block
+ if4 = findDefinition(interface2, 2, 20); // Ordinary INTERFACE block
+ def1 = findDefinition(interface1, 24, 18);
+ def2 = findDefinition(definition1, 1, 18);
+ def3 = findDefinition(definition2, 1, 18);
+ }
+
+ public void testResolveInterfaceBinding() throws Exception
+ {
+ checkContainsAllDefinitions(if1.resolveInterfaceBinding());
+ assertTrue(if2.resolveInterfaceBinding().isEmpty()); // Interface for subprogram parameter
+ checkContainsAllDefinitions(if3.resolveInterfaceBinding());
+ checkContainsAllDefinitions(if4.resolveInterfaceBinding());
+ }
+
+ public void testFindMatchingDeclarationsInInterfaces() throws Exception
+ {
+ checkContainsAllInterfaces(def1.findMatchingDeclarationsInInterfaces());
+ checkContainsAllInterfaces(def2.findMatchingDeclarationsInInterfaces());
+ checkContainsAllInterfaces(def3.findMatchingDeclarationsInInterfaces());
+ }
+
+ private void checkContainsAllDefinitions(Collection<Definition> defs)
+ {
+ assertEquals(3, defs.size());
+ assertTrue(defs.contains(def1));
+ assertTrue(defs.contains(def2));
+ assertTrue(defs.contains(def3));
+ }
+
+ private void checkContainsAllInterfaces(Collection<Definition> defs)
+ {
+ assertEquals(3, defs.size());
+ assertTrue(defs.contains(if1));
+ assertFalse(defs.contains(if2)); // Interface for subprogram parameter
+ assertTrue(defs.contains(if3));
+ assertTrue(defs.contains(if4));
+ }
+
+ private Definition findDefinition(IFile file, int line, int col)
+ {
+ IFortranAST ast = PhotranVPG.getInstance().acquireTransientAST(file); assertNotNull(ast);
+ Token token = findTokenByLineCol(ast, line, col); assertNotNull(token);
+ List<Definition> defs = token.resolveBinding(); assertEquals(1, defs.size());
+ Definition def = defs.get(0);
+ assertEquals(file, def.getTokenRef().getFile());
+ assertEquals(token.getFileOffset(), def.getTokenRef().getOffset());
+ return def;
+ }
+
+ private Token findTokenByLineCol(IFortranAST ast, int line, int col)
+ {
+ for (Token token : ast)
+ if (token.getLine() == line && token.getCol() == col)
+ return token;
+
+ return null;
+ }
+}
diff --git a/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java b/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java
index 4037954a..d892fc56 100644
--- a/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java
+++ b/org.eclipse.photran.core.vpg/src/org/eclipse/photran/internal/core/analysis/binding/Definition.java
@@ -458,7 +458,8 @@ public class Definition implements Serializable, Comparable<Definition>
{
Definition def = PhotranVPG.getInstance().getDefinitionFor(d);
if (def != null)
- result.add(def);
+ if ((def.isSubprogram() && !def.isInInterfaceBlock()) || def.isSubprogramArgument())
+ result.add(def);
}
return result;
}

Back to the top