Skip to content

Commit 4d4eb63

Browse files
authored
Merge pull request #45 from tokyRT/43-Missing-read-access-inside-array-slicing
Create read access inside array slice
2 parents 6dce184 + d0a1f26 commit 4d4eb63

File tree

4 files changed

+106
-4
lines changed

4 files changed

+106
-4
lines changed

resources/examples/project1/src/moduleAtRoot13.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,18 @@ def function_with_keyword_argument(arg0, arg1=10):
190190

191191
variableToAccessInKeywordArgumentCallInParenthesis = 42
192192
function_with_keyword_argument(1, arg1 = (variableToAccessInKeywordArgumentCallInParenthesis))
193+
194+
variableToAccessInArraySlice = 5
195+
arrayToBeAccessedInSlice = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
196+
197+
def variable_to_access_in_array_slice_1():
198+
return arrayToBeAccessedInSlice[:variableToAccessInArraySlice]
199+
200+
def variable_to_access_in_array_slice_2():
201+
return arrayToBeAccessedInSlice[1:variableToAccessInArraySlice]
202+
203+
def variable_to_access_in_array_slice_3():
204+
return arrayToBeAccessedInSlice[::variableToAccessInArraySlice]
205+
206+
def variable_to_access_in_array_slice_with_parentheses():
207+
return arrayToBeAccessedInSlice[1:(variableToAccessInArraySlice)]

src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5569,6 +5569,82 @@ FamixPythonProject1Test >> testReadAccessInANot [
55695569
self assert: (module accesses anySatisfy: [ :anAccess | anAccess variable = global ])
55705570
]
55715571
5572+
{ #category : 'tests - accesses' }
5573+
FamixPythonProject1Test >> testReadAccessInArraySlice1 [
5574+
5575+
| global function access |
5576+
global := self globalVariableNamed: 'variableToAccessInArraySlice'.
5577+
function := self functionNamed: 'variable_to_access_in_array_slice_1'.
5578+
5579+
access := (global incomingAccesses select: [ :anAccess | anAccess accessor = function ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ].
5580+
5581+
self assert: access class equals: FamixPythonAccess.
5582+
self assert: access source equals: function.
5583+
self assert: access accessor equals: function.
5584+
self assert: (access target includes: global).
5585+
self assert: access variable equals: global.
5586+
self deny: access isWrite.
5587+
self assert: access isRead.
5588+
self assert: (function accesses anySatisfy: [ :anAccess | anAccess variable = global ])
5589+
]
5590+
5591+
{ #category : 'tests - accesses' }
5592+
FamixPythonProject1Test >> testReadAccessInArraySlice2 [
5593+
5594+
| global function access |
5595+
global := self globalVariableNamed: 'variableToAccessInArraySlice'.
5596+
function := self functionNamed: 'variable_to_access_in_array_slice_2'.
5597+
5598+
access := (global incomingAccesses select: [ :anAccess | anAccess accessor = function ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ].
5599+
5600+
self assert: access class equals: FamixPythonAccess.
5601+
self assert: access source equals: function.
5602+
self assert: access accessor equals: function.
5603+
self assert: (access target includes: global).
5604+
self assert: access variable equals: global.
5605+
self deny: access isWrite.
5606+
self assert: access isRead.
5607+
self assert: (function accesses anySatisfy: [ :anAccess | anAccess variable = global ])
5608+
]
5609+
5610+
{ #category : 'tests - accesses' }
5611+
FamixPythonProject1Test >> testReadAccessInArraySlice3 [
5612+
5613+
| global function access |
5614+
global := self globalVariableNamed: 'variableToAccessInArraySlice'.
5615+
function := self functionNamed: 'variable_to_access_in_array_slice_3'.
5616+
5617+
access := (global incomingAccesses select: [ :anAccess | anAccess accessor = function ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ].
5618+
5619+
self assert: access class equals: FamixPythonAccess.
5620+
self assert: access source equals: function.
5621+
self assert: access accessor equals: function.
5622+
self assert: (access target includes: global).
5623+
self assert: access variable equals: global.
5624+
self deny: access isWrite.
5625+
self assert: access isRead.
5626+
self assert: (function accesses anySatisfy: [ :anAccess | anAccess variable = global ])
5627+
]
5628+
5629+
{ #category : 'tests - accesses' }
5630+
FamixPythonProject1Test >> testReadAccessInArraySliceWithParentheses [
5631+
5632+
| global function access |
5633+
global := self globalVariableNamed: 'variableToAccessInArraySlice'.
5634+
function := self functionNamed: 'variable_to_access_in_array_slice_with_parentheses'.
5635+
5636+
access := (global incomingAccesses select: [ :anAccess | anAccess accessor = function ]) detectMax: [ :anAccess | anAccess sourceAnchor startPos ].
5637+
5638+
self assert: access class equals: FamixPythonAccess.
5639+
self assert: access source equals: function.
5640+
self assert: access accessor equals: function.
5641+
self assert: (access target includes: global).
5642+
self assert: access variable equals: global.
5643+
self deny: access isWrite.
5644+
self assert: access isRead.
5645+
self assert: (function accesses anySatisfy: [ :anAccess | anAccess variable = global ])
5646+
]
5647+
55725648
{ #category : 'tests - accesses' }
55735649
FamixPythonProject1Test >> testReadAccessInAssertStatement [
55745650

src/Famix-Python-Importer/FamixPythonVisitor.class.st

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1524,6 +1524,12 @@ FamixPythonVisitor >> visitReturnStatement: aNode [
15241524
^ self visitChildren: aNode
15251525
]
15261526

1527+
{ #category : 'visiting - visitChildren' }
1528+
FamixPythonVisitor >> visitSlice: aNode [
1529+
1530+
^ self visitChildren: aNode
1531+
]
1532+
15271533
{ #category : 'visiting - visitChildren' }
15281534
FamixPythonVisitor >> visitString: aStringNode [
15291535
"

src/Famix-Python-Importer/FamixTSNodeWrapper.extension.st

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@ FamixTSNodeWrapper >> isAccessOrReferenceNode [
1212
"I should return true if an Identifier node represent an access or a reference."
1313

1414
(self parent type = #attribute and: [ self parent isInCall ]) ifTrue: [ ^ true ].
15-
15+
1616
(self isInField: #value ofParentOfType: #keyword_argument) ifTrue: [ ^ true ].
1717

18-
^ #( elif_clause list argument_list return_statement lambda if_statement comparison_operator binary_operator assignment not_operator expression_statement
19-
augmented_assignment unary_operator boolean_operator pair list_splat default_parameter dictionary_splat #if_clause #for_in_clause generator_expression
20-
list_comprehension dictionary_comprehension string_content interpolation subscript tuple expression_list) includes: self parent type
18+
"this is for the case where a slice contains variable wrapped in parenthesis
19+
e.g arr[1:(end)] or arr[1:(((end)))]"
20+
(self parent type = #parenthesized_expression and: [ (self parentOfType: #slice) isNotNil ]) ifTrue: [ ^ true ].
21+
22+
^ #( elif_clause list argument_list return_statement lambda if_statement comparison_operator binary_operator assignment not_operator
23+
expression_statement augmented_assignment unary_operator boolean_operator pair list_splat default_parameter dictionary_splat
24+
#if_clause #for_in_clause generator_expression list_comprehension dictionary_comprehension string_content interpolation subscript
25+
tuple expression_list slice ) includes: self parent type
2126
]
2227

2328
{ #category : '*Famix-Python-Importer' }

0 commit comments

Comments
 (0)