Skip to content
Snippets Groups Projects
Commit f82bbf76 authored by René Schöne's avatar René Schöne
Browse files

Add JavaDeclaration and JavaScope. Support assertNotShadow in tests.

parent b5e41085
No related branches found
No related tags found
No related merge requests found
...@@ -83,8 +83,8 @@ aspect ScopeTreeConstructors { ...@@ -83,8 +83,8 @@ aspect ScopeTreeConstructors {
return scope; return scope;
} }
syn lazy JavaDeclaration Declarator.asDeclaration() { syn lazy SimpleJavaDeclaration Declarator.asDeclaration() {
JavaDeclaration decl = new JavaDeclaration(getID()); SimpleJavaDeclaration decl = new SimpleJavaDeclaration(getID());
decl.setDeclarator(this); decl.setDeclarator(this);
return decl; return decl;
} }
......
// glue relation for the Java-based variable shadowing analysis // glue relation for the Java-based variable shadowing analysis
rel ScopeTree.Program -> Program; rel ScopeTree.Program -> Program;
TypeDeclScope : Scope; abstract JavaScope : Scope;
TypeDeclScope : JavaScope;
rel TypeDeclScope.typeDecl -> TypeDecl; rel TypeDeclScope.typeDecl -> TypeDecl;
BlockScope : Scope; BlockScope : JavaScope;
rel BlockScope.block -> Block; rel BlockScope.block -> Block;
ForStmtScope : Scope; ForStmtScope : JavaScope;
rel ForStmtScope.forStmt -> ForStmt; rel ForStmtScope.forStmt -> ForStmt;
EnhancedForStmtScope : Scope; EnhancedForStmtScope : JavaScope;
rel EnhancedForStmtScope.enhancedForStmt -> EnhancedForStmt; rel EnhancedForStmtScope.enhancedForStmt -> EnhancedForStmt;
JavaDeclaration : Declaration; abstract JavaDeclaration : Declaration ;
rel JavaDeclaration.declarator -> Declarator; SimpleJavaDeclaration : JavaDeclaration;
rel SimpleJavaDeclaration.declarator -> Declarator;
JavaParameterDeclaration : Declaration; JavaParameterDeclaration : JavaDeclaration;
rel JavaParameterDeclaration.parameterDeclaration -> ParameterDeclaration; rel JavaParameterDeclaration.parameterDeclaration -> ParameterDeclaration;
JavaInferredLambdaParameterDeclaration : Declaration; JavaInferredLambdaParameterDeclaration : JavaDeclaration;
rel JavaInferredLambdaParameterDeclaration.inferredParameterDeclaration -> InferredParameterDeclaration; rel JavaInferredLambdaParameterDeclaration.inferredParameterDeclaration -> InferredParameterDeclaration;
aspect Shadow{ aspect Shadow{
// --- toString ---
eq TypeDeclScope.toString() = getTypeDecl().getClass().getSimpleName() + "-Scope"; eq TypeDeclScope.toString() = getTypeDecl().getClass().getSimpleName() + "-Scope";
eq BlockScope.toString() = getBlock().getClass().getSimpleName() + "-Scope"; eq BlockScope.toString() = getBlock().getClass().getSimpleName() + "-Scope";
eq ForStmtScope.toString() = getForStmt().getClass().getSimpleName() + "-Scope"; eq ForStmtScope.toString() = getForStmt().getClass().getSimpleName() + "-Scope";
eq EnhancedForStmtScope.toString() = getEnhancedForStmt().getClass().getSimpleName() + "-Scope"; eq EnhancedForStmtScope.toString() = getEnhancedForStmt().getClass().getSimpleName() + "-Scope";
eq JavaDeclaration.toString() = getDeclarator().getClass().getSimpleName() + ":" + super.toString(); eq SimpleJavaDeclaration.toString() = getDeclarator().getClass().getSimpleName() + ":" + super.toString();
eq JavaParameterDeclaration.toString() = getParameterDeclaration().getClass().getSimpleName() + ":" + super.toString(); eq JavaParameterDeclaration.toString() = getParameterDeclaration().getClass().getSimpleName() + ":" + super.toString();
eq JavaInferredLambdaParameterDeclaration.toString() = getInferredParameterDeclaration().getClass().getSimpleName() + ":" + super.toString(); eq JavaInferredLambdaParameterDeclaration.toString() = getInferredParameterDeclaration().getClass().getSimpleName() + ":" + super.toString();
public int TypeDeclScope.lineNumber(){ // --- lineNumber ---
return getTypeDecl().lineNumber(); syn int JavaScope.lineNumber();
} eq TypeDeclScope.lineNumber() = getTypeDecl().lineNumber();
public int BlockScope.lineNumber(){ eq BlockScope.lineNumber() = getBlock().lineNumber();
return getBlock().lineNumber(); eq ForStmtScope.lineNumber() = getForStmt().lineNumber();
} eq EnhancedForStmtScope.lineNumber() = getEnhancedForStmt().lineNumber();
public int ForStmtScope.lineNumber(){ syn int JavaDeclaration.lineNumber();
return getForStmt().lineNumber(); eq SimpleJavaDeclaration.lineNumber() = getDeclarator().lineNumber();
} eq JavaParameterDeclaration.lineNumber() = getParameterDeclaration().lineNumber();
public int EnhancedForStmtScope.lineNumber(){ eq JavaInferredLambdaParameterDeclaration.lineNumber() = getInferredParameterDeclaration().lineNumber();
return getEnhancedForStmt().lineNumber();
}
public int JavaDeclaration.lineNumber() {
return getDeclarator().lineNumber();
}
public int JavaParameterDeclaration.lineNumber() {
return getParameterDeclaration().lineNumber();
}
public int JavaInferredLambdaParameterDeclaration.lineNumber() {
return getInferredParameterDeclaration().lineNumber();
}
public String TypeDeclScope.sourceFile() { // --- sourceFile ---
return getTypeDecl().sourceFile(); syn String JavaScope.sourceFile();
} eq TypeDeclScope.sourceFile() = getTypeDecl().sourceFile();
public String BlockScope.sourceFile() { eq BlockScope.sourceFile() = getBlock().sourceFile();
return getBlock().sourceFile(); eq ForStmtScope.sourceFile() = getForStmt().sourceFile();
} eq EnhancedForStmtScope.sourceFile() = getEnhancedForStmt().sourceFile();
public String ForStmtScope.sourceFile() { syn String JavaDeclaration.sourceFile();
return getForStmt().sourceFile(); eq SimpleJavaDeclaration.sourceFile() = getDeclarator().sourceFile();
} eq JavaParameterDeclaration.sourceFile() = getParameterDeclaration().sourceFile();
public String EnhancedForStmtScope.sourceFile() { eq JavaInferredLambdaParameterDeclaration.sourceFile() = getInferredParameterDeclaration().sourceFile();
return getEnhancedForStmt().sourceFile();
}
public String JavaDeclaration.sourceFile() {
return getDeclarator().sourceFile();
}
public String JavaParameterDeclaration.sourceFile() {
return getParameterDeclaration().sourceFile();
}
public String JavaInferredLambdaParameterDeclaration.sourceFile() {
return getInferredParameterDeclaration().sourceFile();
}
// --- asJavaDeclaration ---
syn JavaDeclaration Declaration.asJavaDeclaration() = null;
eq JavaDeclaration.asJavaDeclaration() = this;
} }
package org.extendj; package org.extendj;
import org.extendj.ast.AbstractFinding; import org.extendj.ast.*;
import org.extendj.ast.Declaration;
import org.extendj.ast.MultipleDeclarationFinding;
import org.extendj.ast.VariableShadowFinding;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public abstract class ScopeAnalysisTest { public abstract class ScopeAnalysisTest {
static void assertShadow(Set<AbstractFinding> findings, String name, int shadowerLine, int shadowedLine) { private static void assertShadow(Set<AbstractFinding> findings,
BiFunction<JavaDeclaration, JavaDeclaration, Boolean> test,
Supplier<String> failMessage) {
for (AbstractFinding finding : findings) { for (AbstractFinding finding : findings) {
if (finding instanceof VariableShadowFinding) { if (finding instanceof VariableShadowFinding) {
Declaration shadower = ((VariableShadowFinding)finding).getShadower(); JavaDeclaration shadower = ((VariableShadowFinding)finding).getShadower().asJavaDeclaration();
Declaration shadowed = ((VariableShadowFinding)finding).getShadowed(); JavaDeclaration shadowed = ((VariableShadowFinding)finding).getShadowed().asJavaDeclaration();
if (shadowed.getName().equals(name) && shadowed.lineNumber() == shadowedLine && shadower.lineNumber() == shadowerLine) { if (test.apply(shadower, shadowed)) {
return; return;
} }
} }
} }
Assertions.fail("No shadow finding found for name '" + name + "' in lines " + shadowerLine + " > " + shadowedLine); 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.lineNumber() == shadowedLine &&
shadower.sourceFile().equals(shadowerSourceFile) &&
shadower.lineNumber() == shadowerLine,
() -> "No shadow finding found for name '" + name + "' in " +shadowerSourceFile + ":" + shadowerLine + " > " + shadowedSourceFile + ":" + shadowedLine);
} }
static void assertRedefinition(Set<AbstractFinding> findings, String name, int declLine) { static void assertRedefinition(Set<AbstractFinding> findings, String name, int declLine) {
...@@ -33,4 +54,22 @@ public abstract class ScopeAnalysisTest { ...@@ -33,4 +54,22 @@ public abstract class ScopeAnalysisTest {
} }
Assertions.fail("No multi-decl finding found for name '" + name + "' in line " + declLine); 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);
} catch (AssertionError e) {
return;
}
Assertions.fail("There should not be a shadow finding for name '" + name + "' in " + shadowerSourceFile + ":" + shadowerLine + " > " + shadowedSourceFile + ":" + shadowedLine);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment