diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsSpecific.qll b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsSpecific.qll index 1b22e8740bc9..7adc24bab14f 100644 --- a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsSpecific.qll +++ b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsSpecific.qll @@ -142,15 +142,13 @@ API::Node getExtraSuccessorFromNode(API::Node node, AccessPathTokenBase token) { // `DataFlow::DictionaryElementContent` just from seeing a subscript read, so we would // need to add that. (also need to handle things like `DictionaryElementAny` which // doesn't have any value for .getAnArgument()) - ( - token.getName() = "DictionaryElement" and - result = node.getSubscript(token.getAnArgument()) - or - token.getName() = "DictionaryElementAny" and - result = node.getASubscript() and - not exists(token.getAnArgument()) - // TODO: ListElement/SetElement/TupleElement - ) + token.getName() = "DictionaryElement" and + result = node.getSubscript(token.getAnArgument()) + or + token.getName() in ["DictionaryElementAny", "ListElement"] and + result = node.getASubscript() and + not exists(token.getAnArgument()) + // TODO: SetElement/TupleElement // Some features don't have MaD tokens yet, they would need to be added to API-graphs first. // - decorators ("DecoratedClass", "DecoratedMember", "DecoratedParameter") } @@ -261,7 +259,7 @@ predicate isExtraValidTokenNameInIdentifyingAccessPath(string name) { name = [ "Member", "Instance", "Awaited", "Call", "Method", "Subclass", "DictionaryElement", - "DictionaryElementAny" + "DictionaryElementAny", "ListElement" ] } @@ -270,7 +268,7 @@ predicate isExtraValidTokenNameInIdentifyingAccessPath(string name) { * in an identifying access path. */ predicate isExtraValidNoArgumentTokenInIdentifyingAccessPath(string name) { - name = ["Instance", "Awaited", "Call", "Subclass", "DictionaryElementAny"] + name = ["Instance", "Awaited", "Call", "Subclass", "DictionaryElementAny", "ListElement"] } /** diff --git a/python/ql/test/library-tests/frameworks/data/test.expected b/python/ql/test/library-tests/frameworks/data/test.expected index 1e229a280390..84cc34585ca6 100644 --- a/python/ql/test/library-tests/frameworks/data/test.expected +++ b/python/ql/test/library-tests/frameworks/data/test.expected @@ -108,6 +108,7 @@ isSource | test.py:119:20:119:30 | ControlFlowNode for getSource() | test-source | | test.py:124:1:124:33 | ControlFlowNode for Attribute() | test-source | | test.py:126:11:126:43 | ControlFlowNode for Attribute() | test-source | +| test.py:129:11:129:39 | ControlFlowNode for Attribute() | test-source | syntaxErrors | Member[foo | | Member[foo] .Member[bar] | diff --git a/python/ql/test/library-tests/frameworks/data/test.ext.yml b/python/ql/test/library-tests/frameworks/data/test.ext.yml index 26fe6012d0e1..487276eedf66 100644 --- a/python/ql/test/library-tests/frameworks/data/test.ext.yml +++ b/python/ql/test/library-tests/frameworks/data/test.ext.yml @@ -27,7 +27,7 @@ extensions: - ["testlib", "Member[source_dict].DictionaryElement[key].Member[func].ReturnValue", "test-source"] - ["testlib", "Member[source_dict_any].DictionaryElementAny.Member[func].ReturnValue", "test-source"] # TODO: Add support for list/tuples - # - ["testlib", "Member[source_list].ListElement.Member[func].ReturnValue", "test-source"] + - ["testlib", "Member[source_list].ListElement.Member[func].ReturnValue", "test-source"] # - ["testlib", "Member[source_tuple].TupleElement[0].Member[func].ReturnValue", "test-source"] - addsTo: