apple / swift

The Swift Programming Language

Home Page:https://swift.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[SR-14162] Index store does not relate static property getter used as subscript key.

swift-ci opened this issue · comments

Previous ID SR-14162
Radar rdar://problem/74102056
Original Reporter Leitch (JIRA User)
Type Bug
Environment

Swift 5.3 & 5.4 beta (Xcode 12.5 beta 1)

Additional Detail from JIRA
Votes 1
Component/s Source Tooling
Labels Bug
Assignee None
Priority Medium

md5: 7c96ce342087142383568e877034f2d5

Issue Description:

Given the following code:

enum FixtureEnum128 {
    static let someVar = ""
}

class FixtureClass128 {
    func someFunc() {
        var s: [String: Int] = [:]
        s[FixtureEnum128.someVar] = 0
    }
}

The index store does not relate the someVar getter when used as a subscript key. It does however relate the setter, which is also incorrect.

1:6 | enum/Swift | FixtureEnum128 | s:14swift_ide_test14FixtureEnum128O | Def | rel: 0
2:16 | static-property/Swift | someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvpZ | Def,RelChild | rel: 1
  RelChild | enum/Swift | FixtureEnum128 | s:14swift_ide_test14FixtureEnum128O
2:16 | static-method/acc-get/Swift | getter:someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvgZ | Def,Impl,RelChild,RelAcc | rel: 1
  RelChild,RelAcc | static-property/Swift | someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvpZ
2:16 | static-method/acc-set/Swift | setter:someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvsZ | Def,Impl,RelChild,RelAcc | rel: 1
  RelChild,RelAcc | static-property/Swift | someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvpZ
5:7 | class/Swift | FixtureClass128 | s:14swift_ide_test15FixtureClass128C | Def | rel: 0
6:10 | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF | Def,Dyn,RelChild | rel: 1
  RelChild | class/Swift | FixtureClass128 | s:14swift_ide_test15FixtureClass128C
7:17 | struct/Swift | String | s:SS | Ref,RelCont | rel: 1
  RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
7:25 | struct/Swift | Int | s:Si | Ref,RelCont | rel: 1
  RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
8:10 | instance-property/subscript/Swift | subscript(_:) | s:SDyq_Sgxcip | Ref,Writ,RelCont | rel: 1
  RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
8:10 | instance-method/acc-set/Swift | setter:subscript(_:) | s:SDyq_Sgxcis | Ref,Call,Impl,RelCall,RelCont | rel: 1
  RelCall,RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
8:11 | enum/Swift | FixtureEnum128 | s:14swift_ide_test14FixtureEnum128O | Ref,RelCont | rel: 1
  RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
8:26 | static-property/Swift | someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvpZ | Ref,Writ,RelCont | rel: 1
  RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
8:26 | static-method/acc-set/Swift | setter:someVar | s:14swift_ide_test14FixtureEnum128O7someVarSSvsZ | Ref,Call,Impl,RelRec,RelCall,RelCont | rel: 2
  RelCall,RelCont | instance-method/Swift | someFunc() | s:14swift_ide_test15FixtureClass128C8someFuncyyF
  RelRec | enum/Swift | FixtureEnum128 | s:14swift_ide_test14FixtureEnum128O
5:7 | constructor/Swift | init() | s:14swift_ide_test15FixtureClass128CACycfc | Def,Impl,RelChild | rel: 1
  RelChild | class/Swift | FixtureClass128 | s:14swift_ide_test15FixtureClass128C

Comment by Ian Leitch (JIRA)

/cc @benlangmuir

Comment by Michael Thole (JIRA)

Ran into this today using Periphery to find dead code; false positive attributable to this bug. Xcode 13.

https://github.com/peripheryapp/periphery

Looks like this is fixed in at least swift 5.7:

/*
     enum=FixtureEnum128=s:3foo14FixtureEnum128O=definition
     v  */
enum FixtureEnum128 {
    /*
               staticMethod.accessorGetter=getter:someVar=s:3foo14FixtureEnum128O7someVarSSvgZ=definition, implicit, childOf, accessorOf
               staticMethod.accessorSetter=setter:someVar=s:3foo14FixtureEnum128O7someVarSSvsZ=definition, implicit, childOf, accessorOf
               staticProperty=someVar=s:3foo14FixtureEnum128O7someVarSSvpZ=definition, childOf
               v  */
    static let someVar = ""
}

/*
      constructor=init()=s:3foo15FixtureClass128CACycfc=definition, implicit, childOf
      class=FixtureClass128=s:3foo15FixtureClass128C=definition
      v  */
class FixtureClass128 {
    /*
         instanceMethod=someFunc()=s:3foo15FixtureClass128C8someFuncyyF=definition, dynamic, childOf
         v  */
    func someFunc() {
        /*
                struct=String=s:SS=reference, containedBy
                |       struct=Int=s:Si=reference, containedBy
                v       v  */
        var s: [String: Int] = [:]
        /*
         instanceMethod.accessorSetter=setter:subscript(_:)=s:SDyq_Sgxcis=reference, call, implicit, calledBy, containedBy
         instanceProperty.swiftSubscript=subscript(_:)=s:SDyq_Sgxcip=reference, write, containedBy
         |enum=FixtureEnum128=s:3foo14FixtureEnum128O=reference, containedBy
         ||              staticMethod.accessorSetter=setter:someVar=s:3foo14FixtureEnum128O7someVarSSvsZ=reference, call, implicit, calledBy, containedBy
         ||              staticProperty=someVar=s:3foo14FixtureEnum128O7someVarSSvpZ=reference, write, containedBy
         vv              v  */
        s[FixtureEnum128.someVar] = 0
    }
}

Looks like this is fixed in at least swift 5.7

@keith Is it really fixed? In your output I only see a seemingly incorrect reference to the setter, but not the getter.

ah sorry I misunderstood