Skip to content

Commit

Permalink
Added test
Browse files Browse the repository at this point in the history
  • Loading branch information
oxisto committed Oct 18, 2023
1 parent 6c110ca commit 8ea5130
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -621,9 +621,9 @@ class ScopeManager : ScopeProvider {
* TODO: We should merge this function with [.resolveFunction]
*/
@JvmOverloads
fun resolveReference(ref: Reference, startScope: Scope? = currentScope): ValueDeclaration? {
fun resolveReference(ref: Reference, startScope: Scope? = ref.scope): ValueDeclaration? {
// Retrieve a unique tag for the particular reference based on the current scope
val tag = ref.buildUniqueTag(startScope)
val tag = ref.uniqueTag

// If we find a match in our symbol table, we can immediately return the declaration
var decl = symbolTable[tag]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import de.fraunhofer.aisec.cpg.graph.declarations.Declaration
import de.fraunhofer.aisec.cpg.graph.declarations.ValueDeclaration
import de.fraunhofer.aisec.cpg.graph.declarations.VariableDeclaration
import de.fraunhofer.aisec.cpg.graph.edge.Properties
import de.fraunhofer.aisec.cpg.graph.scopes.Scope
import de.fraunhofer.aisec.cpg.graph.types.HasType
import de.fraunhofer.aisec.cpg.graph.types.Type
import de.fraunhofer.aisec.cpg.passes.SymbolResolver
Expand Down Expand Up @@ -160,8 +159,9 @@ open class Reference : Expression(), HasType.TypeObserver {
* Its purpose is to cache symbol resolutions, similar to LLVMs system of Unified Symbol
* Resolution (USR).
*/
fun buildUniqueTag(startScope: Scope?): ReferenceTag {
return Objects.hash(this.name, this.resolutionHelper, startScope)
val uniqueTag: ReferenceTag
get() {
return Objects.hash(this.name, this.resolutionHelper, this.scope)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import de.fraunhofer.aisec.cpg.TestUtils.assertRefersTo
import de.fraunhofer.aisec.cpg.graph.*
import de.fraunhofer.aisec.cpg.graph.statements.expressions.ConstructExpression
import de.fraunhofer.aisec.cpg.graph.statements.expressions.MemberCallExpression
import de.fraunhofer.aisec.cpg.graph.statements.expressions.Reference
import de.fraunhofer.aisec.cpg.graph.statements.expressions.ReferenceTag
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertIs
Expand Down Expand Up @@ -71,4 +73,23 @@ class SymbolResolverTest {
assertNotNull(construct)
assertInvokes(construct, constructor)
}

@Test
fun testUniqueTags() {
val result = GraphExamples.getConditionalExpression()

val map = mutableMapOf<ReferenceTag, MutableList<Reference>>()

val refs = result.refs
refs.forEach {
// Build a unique tag based on the scope of the reference is in (since this is usually
// the start scope)
val list = map.computeIfAbsent(it.uniqueTag) { mutableListOf() }
list += it

// All elements in the list must have the same scope and name
assertEquals(1, list.map { ref -> ref.scope }.toSet().size)
assertEquals(1, list.map { ref -> ref.name }.toSet().size)
}
}
}

0 comments on commit 8ea5130

Please sign in to comment.