diff --git a/scope4j/src/main/jastadd/ProgramToScopeTree.jrag b/scope4j/src/main/jastadd/ProgramToScopeTree.jrag index 4695a2fe3e3723a4ecfcc6185be7cbc5e91bea5b..d472e0d0ad48cb60634988e101e6d5f60f314c5d 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 c5c187104159e7d1faa85bbb4a8e9437416b5a31..f07851f479bd3ca8711604597377be973c8a6f7e 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 2ed5d96afd5aea830ebea2dc1d645725018138de..3d53bb46300f7188caf02a89e8bff8c4a775d975 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 32936e35476af347224087c70d4ec66e07ca0090..f54ba0fa2060ac9b76c155824a91153a42e83c09 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 5c537c3b6b8fa220ae98017c856b1e97bb26eaba..ae16c02891af19193758b8400ce236aebdd34bf9 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 db6801480975694a6a521c223488930fd7994a18..6f01c7e2daf89de2df98953194d1d9e23d0c1b36 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());