Skip to content

Commit ec2b517

Browse files
authored
[c#] finish refactoring astForSimpleMemberAccess (#5198)
1 parent 56463fd commit ec2b517

File tree

3 files changed

+27
-40
lines changed

3 files changed

+27
-40
lines changed

Diff for: joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstForExpressionsCreator.scala

+9-31
Original file line numberDiff line numberDiff line change
@@ -311,40 +311,18 @@ trait AstForExpressionsCreator(implicit withSchemaValidation: ValidationMode) {
311311
Seq(_callAst)
312312
}
313313

314-
protected def astForSimpleMemberAccessExpression(accessExpr: DotNetNodeInfo): Seq[Ast] = {
314+
private def astForSimpleMemberAccessExpression(accessExpr: DotNetNodeInfo): Seq[Ast] = {
315315
val fieldIdentifierName = nameFromNode(accessExpr)
316-
317-
val (identifierName, typeFullName) = {
318-
createDotNetNodeInfo(accessExpr.json(ParserKeys.Expression)).node match
319-
case SuppressNullableWarningExpression =>
320-
val baseNode = createDotNetNodeInfo(accessExpr.json(ParserKeys.Expression)(ParserKeys.Operand))
321-
val baseAst = astForNode(baseNode)
322-
val baseTypeFullName = getTypeFullNameFromAstNode(baseAst)
323-
324-
val fieldInScope = scope.tryResolveFieldAccess(fieldIdentifierName, typeFullName = Option(baseTypeFullName))
325-
326-
(
327-
nameFromNode(baseNode),
328-
fieldInScope
329-
.map(_.typeName)
330-
.getOrElse(Defines.Any)
331-
)
332-
case _ => {
333-
val fieldInScope = scope.findFieldInScope(fieldIdentifierName)
334-
val _identifierName =
335-
if (fieldInScope.nonEmpty && fieldInScope.exists(_.isStatic))
336-
scope.surroundingTypeDeclFullName.getOrElse(Defines.Any)
337-
else Constants.This
338-
val _typeFullName = fieldInScope.map(_.typeFullName).getOrElse(Defines.Any)
339-
(_identifierName, _typeFullName)
340-
}
341-
}
342-
343-
val identifier = newIdentifierNode(identifierName, typeFullName)
316+
val baseAst = astForNode(createDotNetNodeInfo(accessExpr.json(ParserKeys.Expression))).head
317+
val baseTypeFullName = getTypeFullNameFromAstNode(baseAst)
318+
val typeFullName = scope
319+
.tryResolveFieldAccess(fieldIdentifierName, Some(baseTypeFullName))
320+
.map(_.typeName)
321+
.getOrElse(Defines.Any)
344322

345323
fieldAccessAst(
346-
Ast(identifier),
347-
s"$identifierName.$fieldIdentifierName",
324+
baseAst,
325+
accessExpr.code,
348326
line(accessExpr),
349327
column(accessExpr),
350328
fieldIdentifierName,

Diff for: joern-cli/frontends/csharpsrc2cpg/src/main/scala/io/joern/csharpsrc2cpg/astcreation/AstSummaryVisitor.scala

+16-7
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,22 @@ trait AstSummaryVisitor(implicit withSchemaValidation: ValidationMode) { this: A
7373
CSharpField(f.name, f.typeFullName)
7474
}
7575

76-
val mapping = mutable.Map
77-
.from(cpg.namespaceBlock.map { namespace =>
78-
namespace.fullName -> mutable.Set.from(namespace.typeDecl.map { typ =>
79-
CSharpType(typ.fullName, typ.method.map(toMethod).l, typ.member.map(toField).l)
80-
})
81-
})
82-
.asInstanceOf[NamespaceToTypeMap]
76+
def toType(t: TypeDecl): CSharpType = {
77+
CSharpType(t.fullName, t.method.map(toMethod).l, t.member.map(toField).l)
78+
}
79+
80+
val mapping = {
81+
// TypeDecls found inside explicit namespace blocks
82+
val withExplicitNamespace = cpg.namespaceBlock.map { namespace =>
83+
namespace.fullName -> mutable.Set.from(namespace.typeDecl.map(toType))
84+
}
85+
86+
// TypeDecls found outside explicit namespace blocks
87+
val withoutExplicitNamespace = Set("" -> mutable.Set.from(cpg.typeDecl.whereNot(_.namespaceBlock).map(toType)))
88+
89+
mutable.Map.from(withExplicitNamespace ++ withoutExplicitNamespace)
90+
}
91+
8392
CSharpProgramSummary(mapping, imports, globalImports)
8493
}
8594

Diff for: joern-cli/frontends/csharpsrc2cpg/src/test/scala/io/joern/csharpsrc2cpg/querying/ast/MemberTests.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ class MemberTests extends CSharpCode2CpgFixture {
328328
| int b;
329329
|
330330
| static Car() { // static constructor
331-
| this.nonInitMaxSpeed = 2000;
331+
| nonInitMaxSpeed = 2000;
332332
| }
333333
|
334334
| public Car() {
@@ -347,7 +347,7 @@ class MemberTests extends CSharpCode2CpgFixture {
347347
inside(m.body.astChildren.isCall.l) {
348348
case staticImplicit :: staticExplicit :: Nil =>
349349
staticExplicit.methodFullName shouldBe Operators.assignment
350-
staticExplicit.code shouldBe "this.nonInitMaxSpeed = 2000"
350+
staticExplicit.code shouldBe "nonInitMaxSpeed = 2000"
351351

352352
inside(staticExplicit.argument.fieldAccess.l) {
353353
case fieldAccess :: Nil =>

0 commit comments

Comments
 (0)