Skip to content

Commit

Permalink
Fix redundant public accessibility analysis false-positive for functi…
Browse files Browse the repository at this point in the history
…on parameter default values, closes #691
  • Loading branch information
ileitch committed Dec 19, 2023
1 parent f5608a4 commit 0fb3b1e
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
- Fix redundant public accessibility analysis false-positive for actors.
- Fix redundant public accessibility analysis false-positive for property wrappers.
- Fix redundant public accessibility analysis false-positive for declarations referenced from a public `@inlinable` function.
- Fix redundant public accessibility analysis false-positive for function parameter default values.

## 2.17.1 (2023-12-04)

Expand Down
48 changes: 32 additions & 16 deletions Sources/PeripheryKit/Syntax/DeclarationSyntaxVisitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -336,22 +336,22 @@ final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {
.union(closureParameterClauseLocations)

results.append((
location,
accessibility,
modifierNames,
attributeNames,
CommentCommand.parseCommands(in: trivia),
type(for: variableType),
typeLocations(for: variableType),
allParameterClauseLocations,
returnClauseTypeLocations.mapSet { $0.location },
typeLocations(for: inheritanceClause),
typeLocations(for: genericParameterClause),
typeLocations(for: genericWhereClause),
locations(for: variableInitFunctionCallExpr),
functionCallMetatypeArgumentLocations(for: variableInitFunctionCallExpr),
didVisitCapitalSelfFunctionCall,
hasGenericFunctionReturnedMetatypeParameters
location: location,
accessibility: accessibility,
modifiers: modifierNames,
attributes: attributeNames,
commentCommands: CommentCommand.parseCommands(in: trivia),
variableType: type(for: variableType),
variableTypeLocations: typeLocations(for: variableType),
parameterTypeLocations: allParameterClauseLocations,
returnTypeLocations: returnClauseTypeLocations.mapSet { $0.location },
inheritedTypeLocations: typeLocations(for: inheritanceClause),
genericParameterLocations: typeLocations(for: genericParameterClause),
genericConformanceRequirementLocations: typeLocations(for: genericWhereClause),
variableInitFunctionCallLocations: locations(for: variableInitFunctionCallExpr),
functionCallMetatypeArgumentLocations: functionCallMetatypeArgumentLocations(for: variableInitFunctionCallExpr),
hasCapitalSelfFunctionCall: didVisitCapitalSelfFunctionCall,
hasGenericFunctionReturnedMetatypeParameters: hasGenericFunctionReturnedMetatypeParameters
))
}

Expand Down Expand Up @@ -396,9 +396,25 @@ final class DeclarationSyntaxVisitor: PeripherySyntaxVisitor {

return clause.parameters.reduce(into: .init(), { result, param in
result.formUnion(typeSyntaxInspector.typeLocations(for: param.type))

if let defaultValue = param.defaultValue?.value {
result.formUnion(identifierLocations(for: defaultValue))
}
})
}

private func identifierLocations(for expr: ExprSyntax) -> Set<SourceLocation> {
expr.children(viewMode: .sourceAccurate).flatMapSet { child in
if let token = child.as(TokenSyntax.self), case .identifier = token.tokenKind {
return [sourceLocationBuilder.location(at: token.positionAfterSkippingLeadingTrivia)]
} else if let childExpr = child.as(ExprSyntax.self) {
return identifierLocations(for: childExpr)
}

return []
}
}

private func typeLocations(for clause: ClosureParameterClauseSyntax?) -> Set<SourceLocation> {
guard let clause = clause else { return [] }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ PublicTypeUsedAsPublicFunctionParameterTypeRetainer().retain1()
PublicTypeUsedAsPublicFunctionParameterTypeRetainer().retain2()
PublicTypeUsedAsPublicFunctionParameterTypeRetainer().retain3()

PublicTypeUsedAsPublicFunctionParameterDefaultValueRetainer().somePublicFunc()

_ = PublicTypeUsedAsPublicFunctionReturnTypeRetainer().retain1()
_ = PublicTypeUsedAsPublicFunctionReturnTypeRetainer().retain2()
_ = PublicTypeUsedAsPublicFunctionReturnTypeRetainer().retain3()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Foundation

public struct PublicTypeUsedAsPublicFunctionParameterDefaultValue {
public static let somePublicValue = 1
}

public class PublicTypeUsedAsPublicFunctionParameterDefaultValueRetainer {
public init() {}

public func somePublicFunc(value: Int = PublicTypeUsedAsPublicFunctionParameterDefaultValue.somePublicValue) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ class RedundantPublicAccessibilityTest: SourceGraphTestCase {
assertNotRedundantPublicAccessibility(.class("PublicTypeUsedAsPublicFunctionParameterTypeClosureReturnType"))
}

func testPublicTypeUsedAsPublicFunctionParameterDefaultValue() {
Self.index()

assertNotRedundantPublicAccessibility(.struct("PublicTypeUsedAsPublicFunctionParameterDefaultValue")) {
self.assertNotRedundantPublicAccessibility(.varStatic("somePublicValue"))
}
}

func testPublicTypeUsedAsPublicFunctionReturnType() {
Self.index()

Expand Down

0 comments on commit 0fb3b1e

Please sign in to comment.