From ee84284d70d25081581f905d225f825fe20efe42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Mat=C4=9Bj?= Date: Wed, 14 Aug 2024 14:11:08 +0200 Subject: [PATCH] Fix struct var parsing --- .../Syntactic analysis/StructParser.swift | 16 ++++- .../StructParserTests.swift | 62 +++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/Sources/Rubicon/Syntactic analysis/StructParser.swift b/Sources/Rubicon/Syntactic analysis/StructParser.swift index a26f5ff..12a9b73 100644 --- a/Sources/Rubicon/Syntactic analysis/StructParser.swift +++ b/Sources/Rubicon/Syntactic analysis/StructParser.swift @@ -50,8 +50,8 @@ private class StructVisitor: SyntaxVisitor { result.append( StructDeclaration( name: (nestedInItemsNames + [name]).joined(separator: "."), - variables: varsVisitor.execute(node: node), - notes: node.leadingTrivia.pieces.compactMap(makeLineComment), + variables: varsVisitor.execute(node: node.memberBlock), + notes: node.leadingTrivia.pieces.compactMap(makeLineComment), accessLevel: parseAccessLevel(from: node) ) ) @@ -127,4 +127,16 @@ private class VariablesVisitor: SyntaxVisitor { } catch {} return .visitChildren } + + override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind { + .skipChildren + } + + override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind { + return .skipChildren + } + + override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind { + return .skipChildren + } } diff --git a/Tests/RubiconTests/Syntactic analysis/StructParserTests.swift b/Tests/RubiconTests/Syntactic analysis/StructParserTests.swift index 141b198..a07cd06 100644 --- a/Tests/RubiconTests/Syntactic analysis/StructParserTests.swift +++ b/Tests/RubiconTests/Syntactic analysis/StructParserTests.swift @@ -162,4 +162,66 @@ final class StructParserTests: XCTestCase { XCTAssertEqual(structs.first?.accessLevel, .private) } + + func test_givenStructWithVariablesAndNestedStruct_whenParse_thenReturnStruct() throws { + let text = """ + struct A { + struct B { + var c: Int + let d: Int + } + + var a: Int + let b: Int + } + """ + + let structs = try sut.parse(text: text) + + XCTAssertEqual(structs.count, 2) + XCTAssertEqual(structs.first?.name, "A") + XCTAssertEqual(structs.first?.variables.count, 2) + XCTAssertEqual(structs.first?.variables.first, .makeStub()) + } + + func test_givenStructWithVariablesAndNestedClass_whenParse_thenReturnStruct() throws { + let text = """ + struct A { + class B { + var c: Int + let d: Int + } + + var a: Int + let b: Int + } + """ + + let structs = try sut.parse(text: text) + + XCTAssertEqual(structs.count, 1) + XCTAssertEqual(structs.first?.name, "A") + XCTAssertEqual(structs.first?.variables.count, 2) + XCTAssertEqual(structs.first?.variables.first, .makeStub()) + } + + func test_givenStructWithVariablesAndNestedEnum_whenParse_thenReturnStruct() throws { + let text = """ + struct A { + enum B { + static var c: Int = 0 + } + + var a: Int + let b: Int + } + """ + + let structs = try sut.parse(text: text) + + XCTAssertEqual(structs.count, 1) + XCTAssertEqual(structs.first?.name, "A") + XCTAssertEqual(structs.first?.variables.count, 2) + XCTAssertEqual(structs.first?.variables.first, .makeStub()) + } }