Skip to content

Commit

Permalink
Better solution for reference candidate
Browse files Browse the repository at this point in the history
  • Loading branch information
oxisto committed Dec 19, 2024
1 parent 6316a28 commit 0494bdb
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ package de.fraunhofer.aisec.cpg.frontends.java
import com.fasterxml.jackson.annotation.JsonIgnore
import de.fraunhofer.aisec.cpg.ScopeManager
import de.fraunhofer.aisec.cpg.frontends.*
import de.fraunhofer.aisec.cpg.graph.declarations.Declaration
import de.fraunhofer.aisec.cpg.graph.declarations.FunctionDeclaration
import de.fraunhofer.aisec.cpg.graph.declarations.RecordDeclaration
import de.fraunhofer.aisec.cpg.graph.declarations.VariableDeclaration
import de.fraunhofer.aisec.cpg.graph.statements.expressions.BinaryOperator
import de.fraunhofer.aisec.cpg.graph.statements.expressions.CallExpression
import de.fraunhofer.aisec.cpg.graph.statements.expressions.MemberExpression
import de.fraunhofer.aisec.cpg.graph.statements.expressions.Reference
import de.fraunhofer.aisec.cpg.graph.types.*
import de.fraunhofer.aisec.cpg.passes.JavaCallResolverHelper
import kotlin.reflect.KClass
Expand Down Expand Up @@ -115,6 +120,25 @@ open class JavaLanguage :
scopeManager: ScopeManager,
) = JavaCallResolverHelper.handleSuperExpression(memberExpression, curClass, scopeManager)

/**
* This function handles some specifics of the Java language when choosing a reference target
* before invoking [Language.bestViableReferenceCandidate].
*/
override fun bestViableReferenceCandidate(ref: Reference): Declaration? {
// Java allows to have "ambiguous" symbol when importing static fields and methods.
// Therefore, it can be that we both import a field and a method with the same name. We
// therefore do some additional filtering of the candidates here, before handling it.
if (ref.candidates.size > 1) {
if (ref.resolutionHelper is CallExpression) {
ref.candidates = ref.candidates.filter { it is FunctionDeclaration }.toSet()

Check warning on line 133 in cpg-language-java/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/java/JavaLanguage.kt

View check run for this annotation

Codecov / codecov/patch

cpg-language-java/src/main/kotlin/de/fraunhofer/aisec/cpg/frontends/java/JavaLanguage.kt#L133

Added line #L133 was not covered by tests
} else {
ref.candidates = ref.candidates.filter { it is VariableDeclaration }.toSet()
}
}

return super.bestViableReferenceCandidate(ref)
}

override val startCharacter = '<'
override val endCharacter = '>'
override val receiverName: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ class JavaExtraPass(ctx: TranslationContext) : TranslationUnitPass(ctx) {
newReference(type.name.fqn(me.name.localName), type = me.type)
.codeAndLocationFrom(me)
.apply { isStaticAccess = true }
ref.language = me.language
walker.replace(parent, me, ref)
}
}
Expand Down

0 comments on commit 0494bdb

Please sign in to comment.