Last active
December 8, 2023 17:11
-
-
Save KaitoMuraoka/720c09c8b01b7d7f978dbc1fb960a69d to your computer and use it in GitHub Desktop.
"let number = 100" を Syntax でマッチ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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