Skip to content

Instantly share code, notes, and snippets.

@KaitoMuraoka
Last active December 8, 2023 17:11
Show Gist options
  • Save KaitoMuraoka/720c09c8b01b7d7f978dbc1fb960a69d to your computer and use it in GitHub Desktop.
Save KaitoMuraoka/720c09c8b01b7d7f978dbc1fb960a69d to your computer and use it in GitHub Desktop.
"let number = 100" を Syntax でマッチ
import Foundation
import SwiftSyntax
import SwiftParser
let sourceFile = Parser.parse(source: "let number = 100")
print(sourceFile.debugDescription)
func getLetMethod() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
print(decl.bindingSpecifier.text) // let
}
}
func getNumberMethod() {
let statements = Array(sourceFile.statements)
let codeBlock = statements[0]
let item = codeBlock.item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let pattern = binding.pattern.as(IdentifierPatternSyntax.self) {
let identifier = pattern.identifier
print(identifier) // number
}
}
}
func getEqual() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let initializer = binding.initializer?.as(InitializerClauseSyntax.self) {
print(initializer.equal.text) // =
}
}
}
func get100Method() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let initializer = binding.initializer?.as(InitializerClauseSyntax.self) {
if let value = initializer.value.as(IntegerLiteralExprSyntax.self) {
print(value.literal) // 100
}
}
}
}
import Foundation
import SwiftSyntax
import SwiftParser
let sourceFile = Parser.parse(source: "let number = 100")
print(sourceFile.debugDescription)
func getLetMethod() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
print(decl.bindingSpecifier) // let
let result = decl.with(\.bindingSpecifier, .keyword(SwiftSyntax.Keyword.var))
print(result.bindingSpecifier) // var
}
}
func getNumberMethod() {
let statements = Array(sourceFile.statements)
let codeBlock = statements[0]
let item = codeBlock.item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let pattern = binding.pattern.as(IdentifierPatternSyntax.self) {
let identifier = pattern.identifier
print(identifier) // number
let result = pattern.with(\.identifier, .identifier("amount"))
print(result.description) // amount
}
}
}
func getEqual() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let initializer = binding.initializer?.as(InitializerClauseSyntax.self) {
print(initializer.equal) // =
}
}
}
func get100Method() {
let statements = Array(sourceFile.statements)
let item = statements[0].item
if let decl = item.as(VariableDeclSyntax.self) {
let bindings = Array(decl.bindings)
let binding = bindings[0]
if let initializer = binding.initializer?.as(InitializerClauseSyntax.self) {
if let value = initializer.value.as(IntegerLiteralExprSyntax.self) {
print(value.literal) // 100
let result = value.with(\.literal, .floatLiteral("100.0"))
print(result.literal) // 100.0
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment