diff --git a/resources/examples/project1/src/moduleAtRoot13.py b/resources/examples/project1/src/moduleAtRoot13.py index 5c4cacb..daecf2d 100644 --- a/resources/examples/project1/src/moduleAtRoot13.py +++ b/resources/examples/project1/src/moduleAtRoot13.py @@ -180,4 +180,13 @@ def function_to_invoke_in_list_splat(indices): def variable_to_access_in_tuple_return(): variableToAccessInTuple = 8 - return 0, variableToAccessInTuple \ No newline at end of file + return 0, variableToAccessInTuple + +def function_with_keyword_argument(arg0, arg1=10): + return arg0 + arg1 + +variableToAccessInKeywordArgumentCall = 42 +function_with_keyword_argument(1, arg1 = variableToAccessInKeywordArgumentCall) + +variableToAccessInKeywordArgumentCallInParenthesis = 42 +function_with_keyword_argument(1, arg1 = (variableToAccessInKeywordArgumentCallInParenthesis)) diff --git a/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st b/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st index 5337c94..ef3b1e1 100644 --- a/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st +++ b/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st @@ -5818,6 +5818,44 @@ FamixPythonProject1Test >> testReadAccessInGeneratorExpression [ self assert: accesses size equals: 2 ] +{ #category : 'tests - accesses' } +FamixPythonProject1Test >> testReadAccessInKeywordArgument [ + + | global module access | + global := self globalVariableNamed: 'variableToAccessInKeywordArgumentCall'. + module := self moduleNamed: 'moduleAtRoot13'. + + access := (global incomingAccesses select: [ :anAccess | anAccess accessor = module ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ]. + + self assert: access class equals: FamixPythonAccess. + self assert: access source equals: module. + self assert: access accessor equals: module. + self assert: access target equals: global. + self assert: access variable equals: global. + self deny: access isWrite. + self assert: access isRead. + self assert: (module accesses anySatisfy: [ :anAccess | anAccess variable = global ]) +] + +{ #category : 'tests - accesses' } +FamixPythonProject1Test >> testReadAccessInKeywordArgumentInParenthesis [ + + | global module access | + global := self globalVariableNamed: 'variableToAccessInKeywordArgumentCallInParenthesis'. + module := self moduleNamed: 'moduleAtRoot13'. + + access := (global incomingAccesses select: [ :anAccess | anAccess accessor = module ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ]. + + self assert: access class equals: FamixPythonAccess. + self assert: access source equals: module. + self assert: access accessor equals: module. + self assert: access target equals: global. + self assert: access variable equals: global. + self deny: access isWrite. + self assert: access isRead. + self assert: (module accesses anySatisfy: [ :anAccess | anAccess variable = global ]) +] + { #category : 'tests - accesses' } FamixPythonProject1Test >> testReadAccessInLambdaBody [ diff --git a/src/Famix-Python-Importer/FamixTSNodeWrapper.extension.st b/src/Famix-Python-Importer/FamixTSNodeWrapper.extension.st index ad73445..830e65e 100644 --- a/src/Famix-Python-Importer/FamixTSNodeWrapper.extension.st +++ b/src/Famix-Python-Importer/FamixTSNodeWrapper.extension.st @@ -12,6 +12,8 @@ FamixTSNodeWrapper >> isAccessOrReferenceNode [ "I should return true if an Identifier node represent an access or a reference." (self parent type = #attribute and: [ self parent isInCall ]) ifTrue: [ ^ true ]. + + (self isInField: #value ofParentOfType: #keyword_argument) ifTrue: [ ^ true ]. ^ #( elif_clause list argument_list return_statement lambda if_statement comparison_operator binary_operator assignment not_operator expression_statement augmented_assignment unary_operator boolean_operator pair list_splat default_parameter dictionary_splat #if_clause #for_in_clause generator_expression