From ffbd4c9ce5d754a7719f66f3a057228ec900f435 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Fri, 3 Jan 2020 21:27:30 +0100
Subject: [PATCH] fixed package check, adapted tests (please check!). test now
 always require (part of the) file name, ask me why!

---
 .../src/main/jastadd/ProgramToScopeTree.jrag  |  4 ++--
 .../src/test/java/org/extendj/InnerTest.java  | 20 ++++++++--------
 .../test/java/org/extendj/ProtectedTest.java  | 24 +++++++++----------
 .../java/org/extendj/ScopeAnalysisTest.java   | 24 +++----------------
 .../java/org/extendj/SimpleScopeTest.java     | 10 ++++----
 .../org/extendj/SuperclassFieldsTest.java     |  6 ++---
 6 files changed, 35 insertions(+), 53 deletions(-)

diff --git a/scope4j/src/main/jastadd/ProgramToScopeTree.jrag b/scope4j/src/main/jastadd/ProgramToScopeTree.jrag
index 4695a2f..d472e0d 100644
--- a/scope4j/src/main/jastadd/ProgramToScopeTree.jrag
+++ b/scope4j/src/main/jastadd/ProgramToScopeTree.jrag
@@ -18,11 +18,11 @@ aspect ProgramToScopeTree {
       to ASTNode.scope()
       for containingScope();
   ClassDecl contributes protectedScope()
-      when !isInnerClass() && superclass().isClassDecl() && superclass().compilationUnit().fromSource() && !accessibleFromPackage(superclass().hostPackage())
+      when !isInnerClass() && superclass().isClassDecl() && superclass().compilationUnit().fromSource() && !hostPackage().equals(superclass().hostPackage())
       to ClassDecl.protectedScope()
       for superclass();
   ClassDecl contributes protectedScope()
-      when !isInnerClass() && superclass().isClassDecl() && superclass().compilationUnit().fromSource() && accessibleFromPackage(superclass().hostPackage())
+      when !isInnerClass() && superclass().isClassDecl() && superclass().compilationUnit().fromSource() &&  hostPackage().equals(superclass().hostPackage())
       to ClassDecl.packageScope()
       for superclass();
   Block contributes scope() to ASTNode.scope() for containingScope();
diff --git a/scope4j/src/test/java/org/extendj/InnerTest.java b/scope4j/src/test/java/org/extendj/InnerTest.java
index c5c1871..f07851f 100644
--- a/scope4j/src/test/java/org/extendj/InnerTest.java
+++ b/scope4j/src/test/java/org/extendj/InnerTest.java
@@ -17,24 +17,24 @@ public class InnerTest extends ScopeAnalysisTest {
     System.out.println(findings);
 
     // anonymous class
-    assertShadow(findings, "fieldA", 11, 13);
-    assertShadow(findings, "fieldA", 13, 3);
+    assertShadow(findings, "fieldA", "ClassA", 11, "ClassA", 13);
+    assertShadow(findings, "fieldA", "ClassA", 13, "ClassA", 3);
 
     // local inner class
-    assertShadow(findings, "fieldA", 27, 29);
-    assertShadow(findings, "fieldA", 29, 3);
-    assertShadow(findings, "changingVar", 25, 19);
+    assertShadow(findings, "fieldA", "ClassA", 27, "ClassA", 29);
+    assertShadow(findings, "fieldA", "ClassA", 29, "ClassA", 3);
+    assertShadow(findings, "changingVar", "ClassA", 25, "ClassA", 19);
 
     // static member class
-    assertShadow(findings, "fieldA", 37, 35);
-    assertShadow(findings, "fieldA", 35, 3);
+    assertShadow(findings, "fieldA", "ClassA", 37, "ClassA", 35);
+    assertShadow(findings, "fieldA", "ClassA", 35, "ClassA", 3);
 
     // member class
-    assertShadow(findings, "fieldA", 44, 42);
-    assertShadow(findings, "fieldA", 42, 3);
+    assertShadow(findings, "fieldA", "ClassA", 44, "ClassA", 42);
+    assertShadow(findings, "fieldA", "ClassA", 42, "ClassA", 3);
 
     // anonymous class defined in other class
-    assertShadow(findings, "fieldB", 5, 10);
+    assertShadow(findings, "fieldB", "ClassB", 5, "ClassB", 10);
     // this finding is currently not found
 //    assertShadow(findings, "fieldB", 10, 4);
 
diff --git a/scope4j/src/test/java/org/extendj/ProtectedTest.java b/scope4j/src/test/java/org/extendj/ProtectedTest.java
index 2ed5d96..3d53bb4 100644
--- a/scope4j/src/test/java/org/extendj/ProtectedTest.java
+++ b/scope4j/src/test/java/org/extendj/ProtectedTest.java
@@ -78,20 +78,20 @@ public class ProtectedTest extends ScopeAnalysisTest {
     assertShadow(findings, "fProtected", classD, 15, classA, 11);
     assertShadow(findings, "fPublic", classD, 16, classA, 12);
     // D.D()
-    assertShadow(findings, "fPrivate", classD, 19, classA, 13);
-    assertShadow(findings, "fPackage", classD, 20, classA, 14);
-    assertShadow(findings, "fProtected", classD, 21, classA, 15);
-    assertShadow(findings, "fPublic", classD, 22, classA, 16);
+    assertNotShadow(findings, "fPrivate", classD, 19, classA, 9); // true, but not helpful
+    assertNotShadow(findings, "fPackage", classD, 20, classA, 10); // true, but not helpful
+    assertShadow(findings, "fProtected", classD, 21, classD, 15);
+    assertShadow(findings, "fPublic", classD, 22, classD, 16);
     // D.foo()
-    assertShadow(findings, "fPrivate", classD, 26, classA, 13);
-    assertShadow(findings, "fPackage", classD, 27, classA, 14);
-    assertShadow(findings, "fProtected", classD, 28, classA, 15);
-    assertShadow(findings, "fPublic", classD, 29, classA, 16);
+    assertNotShadow(findings, "fPrivate", classD, 26, classA, 9); // true, but not helpful
+    assertNotShadow(findings, "fPackage", classD, 27, classA, 10); // true, but not helpful
+    assertShadow(findings, "fProtected", classD, 28, classD, 15);
+    assertShadow(findings, "fPublic", classD, 29, classD, 16);
     // D.bar()
-    assertShadow(findings, "fPrivate", classD, 32, classA, 13);
-    assertShadow(findings, "fPackage", classD, 33, classA, 14);
-    assertShadow(findings, "fProtected", classD, 34, classA, 15);
-    assertShadow(findings, "fPublic", classD, 35, classA, 16);
+    assertNotShadow(findings, "fPrivate", classD, 32, classA, 9); // true, but not helpful
+    assertNotShadow(findings, "fPackage", classD, 33, classA, 10); // true, but not helpful
+    assertShadow(findings, "fProtected", classD, 34, classD, 15);
+    assertShadow(findings, "fPublic", classD, 35, classD, 16);
 
     // within class E
     // E.E()
diff --git a/scope4j/src/test/java/org/extendj/ScopeAnalysisTest.java b/scope4j/src/test/java/org/extendj/ScopeAnalysisTest.java
index 32936e3..f54ba0f 100644
--- a/scope4j/src/test/java/org/extendj/ScopeAnalysisTest.java
+++ b/scope4j/src/test/java/org/extendj/ScopeAnalysisTest.java
@@ -23,22 +23,13 @@ public abstract class ScopeAnalysisTest {
     Assertions.fail(failMessage.get());
   }
 
-  static void assertShadow(Set<AbstractFinding> findings, String name, int shadowerLine, int shadowedLine) {
-    assertShadow(findings,
-        (shadower, shadowed) ->
-            shadowed.getName().equals(name) &&
-                shadowed.lineNumber() == shadowedLine &&
-                shadower.lineNumber() == shadowerLine,
-        () -> "No shadow finding found for name '" + name + "' in lines " + shadowerLine + " > " + shadowedLine);
-  }
-
   static void assertShadow(Set<AbstractFinding> findings, String name, String shadowerSourceFile, int shadowerLine, String shadowedSourceFile, int shadowedLine) {
     assertShadow(findings,
         (shadower, shadowed) ->
             shadowed.getName().equals(name) &&
-                shadowed.sourceFile().equals(shadowedSourceFile) &&
+                shadowed.sourceFile().contains(shadowedSourceFile) &&
                 shadowed.lineNumber() == shadowedLine &&
-                shadower.sourceFile().equals(shadowerSourceFile) &&
+                shadower.sourceFile().contains(shadowerSourceFile) &&
                 shadower.lineNumber() == shadowerLine,
         () -> "No shadow finding found for name '" + name + "' in " +shadowerSourceFile + ":" + shadowerLine + " > " + shadowedSourceFile + ":" + shadowedLine);
   }
@@ -55,18 +46,9 @@ public abstract class ScopeAnalysisTest {
     Assertions.fail("No multi-decl finding found for name '" + name + "' in line " + declLine);
   }
 
-  static void assertNotShadow(Set<AbstractFinding> findings, String name, int shadowerLine, int shadowedLine) {
-    try {
-      assertShadow(findings, name, shadowerLine, shadowedLine);
-    } catch (AssertionError e) {
-      return;
-    }
-    Assertions.fail("There should not be a shadow finding for name '" + name + "' in lines " + shadowerLine + " > " + shadowedLine);
-  }
-
   static void assertNotShadow(Set<AbstractFinding> findings, String name, String shadowerSourceFile, int shadowerLine, String shadowedSourceFile, int shadowedLine) {
     try {
-      assertShadow(findings, name, shadowerLine, shadowedLine);
+      assertShadow(findings, name, shadowerSourceFile, shadowerLine, shadowedSourceFile, shadowedLine);
     } catch (AssertionError e) {
       return;
     }
diff --git a/scope4j/src/test/java/org/extendj/SimpleScopeTest.java b/scope4j/src/test/java/org/extendj/SimpleScopeTest.java
index 5c537c3..ae16c02 100644
--- a/scope4j/src/test/java/org/extendj/SimpleScopeTest.java
+++ b/scope4j/src/test/java/org/extendj/SimpleScopeTest.java
@@ -14,11 +14,11 @@ public class SimpleScopeTest extends ScopeAnalysisTest {
     ScopeAnalysis scopeAnalysis = new ScopeAnalysis();
     Set<AbstractFinding> findings = scopeAnalysis.analyze("src/test/resources/simple", true, false);
 
-    assertShadow(findings, "localVarA", 19, 11);
-    assertShadow(findings, "localVarB", 33, 12);
-    assertShadow(findings, "localVarC", 24, 13);
-    assertShadow(findings, "fieldA", 29, 3);
-    assertShadow(findings, "fieldB", 36, 4);
+    assertShadow(findings, "localVarA", "ClassA", 19, "ClassA", 11);
+    assertShadow(findings, "localVarB", "ClassA", 33, "ClassA", 12);
+    assertShadow(findings, "localVarC", "ClassA", 24, "ClassA", 13);
+    assertShadow(findings, "fieldA", "ClassA", 29, "ClassA", 3);
+    assertShadow(findings, "fieldB", "ClassA", 36, "ClassA", 4);
 
     Assertions.assertEquals(5, findings.size());
   }
diff --git a/scope4j/src/test/java/org/extendj/SuperclassFieldsTest.java b/scope4j/src/test/java/org/extendj/SuperclassFieldsTest.java
index db68014..6f01c7e 100644
--- a/scope4j/src/test/java/org/extendj/SuperclassFieldsTest.java
+++ b/scope4j/src/test/java/org/extendj/SuperclassFieldsTest.java
@@ -16,9 +16,9 @@ public class SuperclassFieldsTest extends ScopeAnalysisTest {
     Set<AbstractFinding> findings = scopeAnalysis.analyze("src/test/resources/superclassFields", false, false);
 
 
-    assertShadow(findings, "fieldC", 19, 3);
-    assertShadow(findings, "fieldB", 21, 2);
-    assertShadow(findings, "fieldB", 2, 4);
+    assertShadow(findings, "fieldC", "ClassB", 19, "ClassB", 3);
+    assertShadow(findings, "fieldB", "ClassB", 21, "ClassB", 2);
+    assertShadow(findings, "fieldB", "ClassB", 2, "ClassA", 4);
 
     Assertions.assertEquals(3, findings.size());
 
-- 
GitLab